按主页按钮时如何清除活动历史堆栈?

时间:2012-01-06 12:23:33

标签: android android-activity back-stack android-navigation

我正在编写一个有两个“模式”的应用程序;一个 查看 模式和一个 编辑 模式。该应用程序公开了两个主要/启动器活动(例如, A D ),这些活动又拥有自己的活动链( B C E F 。两个入口点活动 A D 将在主屏幕中显示两个带有单独标签的图标,并且两个链永远不会交叉,即一旦您在视图中启动应用程序活动 A 的模式,您可以来回走的唯一路线是 A B C 以及是否在活动 D 的编辑模式下启动应用程序,唯一可用的活动链是 D E F

现在,我的问题是如果启动应用程序,例如查看模式(活动链 A B C )并按下该链中任何活动的主页按钮我返回主屏幕(当然)但是如果我然后在编辑模式(活动链 D E F )重新启动应用程序,我会进入我按下Home按钮时打开的活动(即错误链中的活动) - 不是编辑模式的预期入口点;活动 D

如何解决此问题?

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

我想删除整个活动链( A B C D ,按下主页按钮时,历史堆栈中的 E F )但是当我还在链中时仍然保持堆栈完整(我希望能够按来自活动 B 的后退按钮,并进入活动 A 。)

3 个答案:

答案 0 :(得分:4)

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

例如 - 您在清单文件中定义活动:

   <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);

答案 1 :(得分:3)

按主页按钮时请使用以下方法:

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

答案 2 :(得分:1)

您可以考虑为每个链仅使用一个Activity(仅 A D )。

然后实施 A B C 以及 D E F 作为片段,只需在来回导航时更改Activity上显示的片段。

将此与android:noHistory相结合,你应该得到所需的效果 - 虽然它需要一些重写,并且如果你打算在Honeycomb下面定位版本,你可以在项目中包含兼容性包。