如何避免让意图的额外回来?

时间:2013-08-04 11:58:24

标签: android android-intent android-activity

背景

我正在开发的应用程序中至少有2个活动:启动活动和主要活动。 splash事件调用主要活动。

在某些情况下(现在让我们假设它是应用程序的第一次运行),splash活动将一个布尔额外的(使用intent.putExtra)添加到intent为true,并且main活动使用以下命令读取它: p>

getIntent().getBooleanExtra(...,false);

问题

当我在启动活动后打开主要活动时,我只希望看到该标志为真。

这就是为什么我试着打电话(在onCreate中,在我拿到旗帜后):

getIntent().removeExtra(...);

另一种方法(根据this website)将是:

final Intent newIntent = new Intent();
setIntent(newIntent);

另一种方法可能是:

getIntent().putExtra(..., false);

这些都不起作用:出于某种原因,在某些情况下,标志仍然返回为真。

作为一个例子,我可以按主页按钮(当主要活动在前台时),然后我开始一个沉重的应用程序(如剪绳游戏或基准应用程序),然后返回到使用启动器的应用程序。

在这种情况下(并不总是发生),不显示启动活动,而是显示主活动。它再次调用onCreate,而标志本身仍然设置为true。

问题

为什么会发生?为什么意图没有重置?

有没有办法以优雅的方式克服这个问题?

当“savedInstanceState”不为空时忽略标志是否安全?

1 个答案:

答案 0 :(得分:0)

听起来你的虚拟机正在被拆除并重新启动。我在一些设备上观察到,当重新创建VM时,不是进入启动活动,而是从保存状态重建最后一个运行活动。听起来你试图在活动意图中保存状态,这可能是你的问题来自的地方。

避免这样的问题的一个重要关键是要记住传递给onCreate的savedInstanceState包在创建活动 new 时始终为null,在所有其他情况下,例如旋转后重建甚至当VM被拆除时(很可能是你的情况),传递给onCreate的savedInstance包将是非空的..我的建议是使用意图来初始化你的本地状态(最初的)你的标志的值)当savedInstanceState为null时,则永远不要尝试更新你自己的意图,将你的状态保存在savedInstance包中。 E.G。

  class Someactivity extends Activity {
       private static final STATE_FLAG = "flagState";
       private boolean someFlag;

       protected void onCreate (Bundle savedInstanceState) {

          final Intent intent = getIntent();

          if(savedInstanceState==null) {
             // Brand new, set from intent
             someFlag = intent.getBooleanExtra(STATE_FLAG, false);
          } else {
             // Restored, set from saved instance
             someFlag = savedInstanceState.getBoolean(STATE_FLAG, false);
          }

       }

       protected void onSaveInstanceState (Bundle outState) {
          // Save any updates to our activity state
          outState.putBoolean(STATE_FLAG, someFlag);
       }
    }