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,它总是重新启动,我不知道为什么.
我尝试了以下内容: - 使用不同的启动模式,如singleTask和singleInstance,但它没有任何区别.onNewIntent被调用,但如果我打电话finish,HomeActivity重新开始 - 如下所述,我试过moveTaskToBack(true),但是Activity也在恢复(我们真的想要关闭应用而不是将它移到BackStack)
尝试将此标志添加到启动应用程序的意图中: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()方法传递。否则,将创建新的活动并将其放置在正确的任务中。
| 归档时间: |
|
| 查看次数: |
636 次 |
| 最近记录: |