Answers:
在API级别11中,为此添加了一个新的Intent标志:Intent.FLAG_ACTIVITY_CLEAR_TASK
只是为了澄清,使用此:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
不幸的是对于API lvl <= 10,我还没有找到一个干净的解决方案。该“DontHackAndroidLikeThis”的解决方案确实是纯粹的两轮牛车。你不应该那样做。:)
编辑:
根据@ Ben Pearson的评论,对于API <= 10,现在可以使用IntentCompat类。一个可以使用IntentCompat.FLAG_ACTIVITY_CLEAR_TASK
标志来清除任务。因此,您也可以支持API之前的11级。
情况1:仅活动A和B:
这里的活动流是A-> B。单击B上的后退按钮时,我们需要关闭应用程序,然后从A启动Activity B时只需调用finish(),这将防止android将Activity A存储到Backstack中。例如,对于Activity A是应用程序的“放置/启动”屏幕。
Intent newIntent = new Intent(A.this, B.class);
startActivity(newIntent);
finish();
情况2:两个以上的活动:
如果有类似A-> B-> C-> D-> B之类的流程,并且在来自活动D的同时单击活动B中的后退按钮,那么我们应该使用。
Intent newIntent = new Intent(D.this,B.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newIntent);
由于Intent.FLAG_ACTIVITY_CLEAR_TOP和Intent.FLAG_ACTIVITY_NEW_TASK会清除堆栈并将其设置为顶层,因此活动B将从堆栈而不是新实例开始。因此,当我们按返回按钮时,整个应用程序将终止。
在Android的较新版本> = API 16中使用 finishAffinity()
该方法适用于> = API 16。
Intent mIntent = new Intent(mContext,MainActivity.class);
finishAffinity();
startActivity(mIntent);
我也花了几个小时...并同意FLAG_ACTIVITY_CLEAR_TOP听起来像您想要的:清除整个堆栈,除了要启动的活动以外,因此返回按钮退出应用程序。但是正如Mike Repass所述,FLAG_ACTIVITY_CLEAR_TOP仅在您要启动的活动已经在堆栈中时才起作用。当活动不存在时,标志不执行任何操作。
该怎么办?使用FLAG_ACTIVITY_NEW_TASK将正在启动的活动放入堆栈中,这使该活动成为历史记录堆栈上新任务的开始。然后添加FLAG_ACTIVITY_CLEAR_TOP标志。
现在,当FLAG_ACTIVITY_CLEAR_TOP去寻找堆栈中的新活动时,它将在那里并在清除所有其他内容之前将其拉起。
这是我的注销功能;View参数是附加功能的按钮。
public void onLogoutClick(final View view) {
Intent i = new Intent(this, Splash.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
finish();
}
您不应该更改堆栈。Android后退按钮应该可以在网络浏览器中使用。
我可以想到一种方法,但这确实是一个hack。
singleTask
通过将其添加到AndroidManifest
示例中来进行活动:
<activity android:name=".activities.A"
android:label="@string/A_title"
android:launchMode="singleTask"/>
<activity android:name=".activities.B"
android:label="@string/B_title"
android:launchMode="singleTask"/>
扩展Application
将保持去哪里的逻辑。
例:
public class DontHackAndroidLikeThis extends Application {
private Stack<Activity> classes = new Stack<Activity>();
public Activity getBackActivity() {
return classes.pop();
}
public void addBackActivity(Activity activity) {
classes.push(activity);
}
}
从A到B:
DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(A.class);
startActivity(this, B.class);
从B到C:
DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(B.class);
startActivity(this, C.class);
在C中:
If ( shouldNotGoBackToB() ) {
DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.pop();
}
并处理返回按钮以pop()
从堆栈中移出。
再一次,你不应该这样做:)
Application
采用了它们的实例,因此操作系统将无法从破坏的活动中释放剩余的RAM。
开始新活动后,请立即使用startActivity
进行调用,以确保finish()
当前活动不会堆积在新活动之后。
尝试这个:
Intent logout_intent = new Intent(DashboardActivity.this, LoginActivity.class);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(logout_intent);
finish();
您可以使用setter方法直接设置标志。在Kotlin中,or
是按位Java或Java 的替代品|
。
intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK
如果您打算定期使用此功能,请创建一个Intent扩展功能
fun Intent.clearStack() {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
然后,您可以在启动意图之前直接调用此函数
intent.clearStack()
如果需要在其他情况下添加其他标志的选项,请向扩展功能添加可选参数。
fun Intent.clearStack(additionalFlags: Int = 0) {
flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
Intent i = new Intent(MainPoliticalLogin.this, MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
对我来说,没有上述方法不工作。
只需执行此操作即可清除之前的所有活动:
finishAffinity() // if you are in fragment use activity.finishAffinity()
Intent intent = new Intent(this, DestActivity.class); // with all flags you want
startActivity(intent)
有时,您的Android模拟器可能无法连接Eclipse DDMS工具,并要求adb手动启动。在这种情况下,您可以使用命令提示符启动或停止adb。