我正在编写一个有两个“模式”的应用程序;一个 查看 模式和一个 编辑 模式。该应用程序公开了两个主要/启动器活动(例如, 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:noHistory
,android:clearTaskOnLaunch
的各种组合以及AndroidManifest.xml
中涉及的活动的其他属性。但它们似乎只影响了活动,而不是整个链条。
我想删除整个活动链( A , B , C 或 D ,按下主页按钮时,历史堆栈中的 E , F )但是当我还在链中时仍然保持堆栈完整(我希望能够按来自活动 B 的后退按钮,并进入活动 A 。)
答案 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 < strong>和 F 作为片段,只需在来回导航时更改Activity
上显示的片段。
将此与android:noHistory
相结合,你应该得到所需的效果 - 虽然它需要一些重写,并且如果你打算在Honeycomb下面定位版本,你可以在项目中包含兼容性包。