我有一个应用程序,以SplashScreenActivity
开头。之后,会显示LoginActivity
,或者如果用户已登录,则会显示MainActivity
。如果应用程序已在运行,则SplashScreenActivity
将被解除以下
//SplashScreenActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Adding this check for following cases
if (!isTaskRoot())
{
String intentAction = getIntent().getAction();
if (getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) {
finish();
return;
}
if(getIntent().getCategories().contains(GCMIntentService.INTENT_CATEGORY_GH_NOTIFICATION)){
finish();
return;
}
}
出现问题
如果我从PlayStore等其他活动启动应用程序,它会在正确的活动中恢复,如果已经运行的话。这是Intent
我用来在第二个应用中重现
//AnotherApplication.apk
Intent launchIntent = getPackageManager().getLaunchIntentForPackage("my.package.name");
startActivity(launchIntent);
然而,这个动作在某种程度上打破了Backstack。不是在MainActivity
中关闭背压上的应用程序,而是重启应用程序。
//MainActivity.class
@Override
public void onBackPressed() {
if (getNavDrawerMain().isDrawerOpen()) {
getNavDrawerMain().closeDrawer();
} else {
closeApp();
}
}
protected void closeApp() {
if (doubleBackToExitPressedOnce) {
//super.onBackPressed(); //i tried both, but behaviour is the same
finish();
return;
}
this.doubleBackToExitPressedOnce = true;
new Handler().postDelayed(new Runnable() {
@Override
public void run()
doubleBackToExitPressedOnce = false;
}
}, 500);
}
我使用断点并发现MainActivity:onDestroy()被调用,但是它不是将应用程序恢复到HomeScreen,而是重新开始,我不知道为什么。
我尝试了以下内容:
- 使用了不同的启动模式,例如singleTask
和singleInstance
,但它没有任何区别。我会调用onNewIntent
,但如果我致电finish
,HomeActivity
会重新启动
- 如下所述,我尝试了moveTaskToBack(true)
,但是活动也正在恢复(我们真的想要关闭应用而不是将其移到BackStack)
答案 0 :(得分:2)
尝试使用moveTaskToBack(true);
代替finish();
关闭应用。然后它将转到OnRestart()然后转到OnStart() - > OnResume()(并且不会转到OnCreate)。
并确保您的Android设置中的“开发者选项”中没有标记“请勿保留活动”(用户离开后立即销毁所有活动)。
答案 1 :(得分:1)
尝试将此标记添加到启动应用的意图中:RESET_TASK_IF_NEEDED,网址= http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
它的作用:
如果已设置,并且此活动要么在新任务中启动,要么将现有任务置于顶层,那么它将作为任务的前门启动。
您也可以使用: http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT
它的作用:
如果在传递给Context.startActivity()的Intent中设置,则此标志将导致已启动的活动被带到其任务的历史堆栈的前面(如果它已在运行)。
您使用哪一个取决于所需的最终结果。
如果您无法控制谁启动您,则需要将模式设置或启动为单个任务或单个实例。
这里描述:
http://inthecheesefactory.com/blog/understand-android-activity-launchmode/en
有趣的部分:
singleTask
此模式与标准和singleTop完全不同。具有singleTask launchMode的Activity允许在系统中只有一个实例(a.k.a. Singleton)。如果系统中存在一个Activity实例,则整个Task保持实例将移动到顶部,而Intent将通过onNewIntent()方法传递。否则,将创建新的活动并将其放置在适当的任务中。