7

我有一个应用程序,它以SplashScreenActivity. 之后,LoginActivity显示a,或者如果用户已经登录,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;
        }
    }

出现问题

如果我从另一个活动(如 PlayStore)启动应用程序,它会在已运行的正确活动处恢复。这是Intent我用来在第二个应用程序中重现的

//AnotherApplication.apk
Intent launchIntent = getPackageManager().getLaunchIntentForPackage("my.package.name");
startActivity(launchIntent);

但是,此操作以某种方式破坏了 Backstack。它不会在 中的 backpress 上关闭应用程序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,而是总是重新启动,我不知道为什么。

我尝试了以下方法: - 使用了不同的启动模式,例如singleTaskand singleInstance,但没有任何区别。onNewIntent被调用,但如果我调用finish,则HomeActivity重新启动 - 如下所示,我尝试过moveTaskToBack(true),但 Activity 也在重新启动(我们真的想关闭应用程序而不是将其移动到 BackStack)

4

2 回答 2

2

尝试使用moveTaskToBack(true);而不是finish();关闭应用程序。然后它将转到 OnRestart(),然后转到 OnStart()->OnResume()(并且不会转到 OnCreate)。

并确保您没有在 Android 设置的开发人员选项中标记“不保留活动”(用户离开后立即销毁每个活动)。

于 2015-08-14T02:24:47.407 回答
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()方法传递。否则,将创建新的活动并将其放置在适当的任务中。

于 2015-08-12T05:32:10.077 回答