按Home键时如何清除活动历史堆栈?

我正在写一个有两个“模式”的应用程序; 一个查看模式和一个编辑模式。 应用程序公开了两个主要/启动活动(比如AD ),它们又有自己的活动链(分别是BCEF )。 两个入口点活动AD将在主屏幕中显示具有单独标签的两个图标,并且两个链条永远不会交叉,即,一旦以活动A的视图模式启动应用程序,您可以前后走动的唯一路线是ABC ,如果您使用活动D在编辑模式下启动应用程序,唯一可用的活动链是DEF

现在,我的问题是,如果启动应用程序,例如查看模式(活动链ABC ),并按任何活动链中的主页button,我回到主屏幕(当然),但如果我以编辑模式(活动链DEF )重新启动应用程序当按下主页button(即错误链中的某个活动)时,我得到了正在进行的活动 – 而不是编辑模式的预期入口点; 活动D。

我如何解决这个问题?

我已经尝试过android:noHistoryandroid:clearTaskOnLaunchAndroidManifest.xml中涉及活动的其他属性的各种组合。 但他们似乎只影响到活动,而不是整个链条。

我希望在主页button被按下时从历史堆栈中移除整个活动链( ABCDEF ),但仍然保持堆栈原封不动,而我仍然在链中(我想能够按下活动B的后退button并进入活动A )。

Solutions Collecting From Web of "按Home键时如何清除活动历史堆栈?"

听起来你需要在你的home活​​动中使用Intent.FLAG_ACTIVITY_CLEAR_TOP标志,但是当然你不能在AndroidManifest.xml文件中添加这些标志。 也许你应该有一个单一的入口点,然后启动正确的Activity – 你可以使用一个活动别名 ,使它看起来像用户的两个入口点。

例如,您可以在清单文件中定义活动:

  <activity-alias android:label="@string/edit_app_name" android:name="launch_edit" android:targetActivity=".activities.LaunchActivity"> <meta-data android:name="launch_type" android:resource="@string/launch_edit" /> </activity-alias> <activity-alias android:label="@string/view_app_name" android:name="launch_view" android:targetActivity=".activities.LaunchActivity"> <meta-data android:name="launch_type" android:resource="@string/launch_view" /> </activity-alias> 

然后在你的LaunchActivity中你有:

 ActivityInfo activityInfo = getPackageManager().getPackageInfo( this.getComponentName(), PackageManager.GET_ACTIVITIES|PackageManager.GET_META_DATA); int launchTypeResource = activityInfo.metaData.getInt("launch_type"); String launchType = context.getString(launchTypeResource); if(launchType == null) { // handle error throw new Exception(); } Intent newIntent; if(launchType.equals(context.getString(R.string.launch_view)) { newIntent = createIntent(ViewActivity.class); } else if(launchType.equals(context.getString(R.string.launch_edit)) { newIntent = createIntent(EditActivity.class); } newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(newIntent); 

按下主页button,请使用以下方法:

 Intent intent=new Intent(this, HomeClass.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); 

你可以考虑使用每个链只有一个Activity (这将只有AD )。

然后将ABC以及DEF的内容作为片段执行,并在来回导航时更改Activity上显示的片段。

把这个和android:noHistory结合android:noHistory ,你应该得到想要的效果 – 虽然它需要一些重写,并且如果你打算在Honeycomb下面定位版本,那么你在项目中包含了兼容性包。