4

在我的导航中,可以生成以下活动序列:A、B、C、B、C、B、C、...、D。D
活动包含后退按钮的覆盖方法,它将用户发送到 A带Intent.FLAG_ACTIVITY_CLEAR_TOP参数的活动。

活动 A 接收许多必要的额外参数,我的问题是,当我使用此 CLEAR_TOP 标志在 D 活动中触发 startActivity 时,活动 A 似乎没有获得任何先前的额外参数,甚至没有启动 onResume 方法。

这是否意味着 CLEAR_TOP 实际上recreates是目标活动,而不是提出旧的活动?restore those extra intent而且,当我从活动 D 启动活动 A 时,是否有任何系统自然的方法来处理活动 A 中的参数。

PS 现在我看到的唯一选择是在 D 活动中构造意图对象时手动填写那些以前的必要参数。这是一条路吗?

谢谢。

4

3 回答 3

4

正如文档所说的那样简单。

如果同时设置FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_SINGLE_TOP,那么新参数将被推送到onNewIntent()中。

于 2012-07-15T08:59:40.423 回答
4

不确定您是否找到了解决方案,但是覆盖目标活动的 onNewIntent(Intent theNewIntent) 方法并调用 setIntent(theNewIntent) 为我解决了这个问题。

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    /*
     * This overrides the original intent.
     */      
    setIntent(intent);
}
于 2013-08-19T06:07:17.297 回答
2

这是否意味着 CLEAR_TOP 实际上重新创建了目标活动而不是调出旧的活动?

当你使用CLEAR_TOPflag时,target Activity does not recreate,但是当你使用一个新的intent出现Activity A时,你只能在Activity A中获得这个新intent的extras。

而且,当我从活动 D 启动活动 A 时,是否有任何系统自然的方法来恢复活动 A 中的那些额外意图参数?

当您离开活动 A 时,您可以将这些附加内容保存在文件、首选项或全局应用程序变量中。或者您可以在活动 A 中声明一个静态方法,将这些附加内容保存在其中,然后在强制出现之前从活动 D 调用它活动 A:
活动 A:

Public class A extends Activity{
...
public static void saveExtras(){
//save extras in file,preferences,...
}
...
}     

活动 D:

Public class D extends Activity{
...
public void forceActivityA(){
A.saveExtras();
Intent i = new Intent(this,A.class());
...
startActivity(i);
}
...
} 

编辑
当活动 A 再次出现时,它的onCreate()方法再次调用,在这里您可以获得请求它的意图。然后您可以获得意图的标志并将其与67108864(CLEAR_TOP 标志的常量)进行比较。如果它等于这个常量,您将检索您的存储中的数据(文件,首选项,...)。要创建全局变量,您可以看到这个问题

于 2012-07-15T08:55:40.220 回答