Android:BackStack行为不端,如果应用程序是从另一个应用程序启动的

时间:2015-08-06 15:39:25

标签: android back-stack application-close

我有一个应用程序,以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,而是重新开始,我不知道为什么。

我尝试了以下内容: - 使用了不同的启动模式,例如singleTasksingleInstance,但它没有任何区别。我会调用onNewIntent,但如果我致电finishHomeActivity会重新启动 - 如下所述,我尝试了moveTaskToBack(true),但是活动也正在恢复(我们真的想要关闭应用而不是将其移到BackStack)

2 个答案:

答案 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()方法传递。否则,将创建新的活动并将其放置在适当的任务中。