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

lon*_*ngi 6 android application-close back-stack

我有一个应用程序,以一个开头SplashScreenActivity.然后,显示a LoginActivity,或者如果用户已经登录,MainActivity则显示a.如果应用程序已在运行,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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

出现问题

如果我从PlayStore等其他活动启动应用程序,它会在正确的活动中恢复,如果已经运行的话.这是Intent我用来在第二个应用程序中重现

//AnotherApplication.apk
Intent launchIntent = getPackageManager().getLaunchIntentForPackage("my.package.name");
startActivity(launchIntent);
Run Code Online (Sandbox Code Playgroud)

但是,这个动作在某种程度上打破了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);
}
Run Code Online (Sandbox Code Playgroud)

我使用断点并发现MainActivity:onDestroy()被调用,但它不是恢复应用程序到HomeScreen,它总是重新启动,我不知道为什么.

我尝试了以下内容: - 使用不同的启动模式,如singleTasksingleInstance,但它没有任何区别.onNewIntent被调用,但如果我打电话finish,HomeActivity重新开始 - 如下所述,我试过moveTaskToBack(true),但是Activity也在恢复(我们真的想要关闭应用而不是将它移到BackStack)

Joh*_*gun 1

尝试将此标志添加到启动应用程序的意图中:RESET_TASK_IF_NEEDED,URL = 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

有趣的部分:

单一任务

这种模式与standard和singleTop有很大不同。具有 singleTask launchMode 的 Activity 只允许在系统中拥有一个实例(也称为 Singleton)。如果系统中存在一个Activity实例,则该实例所在的整个Task会被移动到顶部,同时Intent会通过onNewIntent()方法传递。否则,将创建新的活动并将其放置在正确的任务中。