7

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

现在,我的问题是,如果以例如查看模式(活动链ABC)启动应用程序并从该链中的任何活动中按下 Home 按钮,我将返回主屏幕(当然)但如果我那时在编辑模式下重新启动应用程序(活动链DEF)我进入按下 Home 按钮时正在进行的活动(即错误链中的活动) - 不是编辑模式的预期入口点; 活动D。 _

我该如何解决这个问题?

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

我想在按下 Home 按钮时从历史堆栈中删除整个活动链(ABCDEF),但在我仍在链中时仍保持堆栈完整(我想要能够从活动B中按下后退按钮并进入活动A)。

4

3 回答 3

4

听起来您需要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);
于 2012-01-06T12:40:45.807 回答
4

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

Intent intent=new Intent(this, HomeClass.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
于 2012-01-06T12:44:12.420 回答
1

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

然后将ABCDEF的内容实现为片段,只需更改Activity来回导航时显示的片段。

将其与此结合android:noHistory,您应该会获得所需的效果 - 尽管它需要一些重写,并且如果您计划将目标版本定位在 Honeycomb 以下,则需要将兼容性包包含到您的项目中。

于 2012-01-06T12:59:36.357 回答