0

背景

我正在开发的应用程序上至少有 2 个活动:一个启动活动和一个主要活动。飞溅活动调用主要活动。

在某些情况下(现在让我们假设它只是应用程序的第一次运行),启动活动会在意图为真时添加一个布尔额外(使用 intent.putExtra),并且主要活动使用以下方式读取它:

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

问题

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

这就是为什么我试图只调用(在 onCreate 中,在我得到标志之后):

getIntent().removeExtra(...);

另一种方法(根据本网站)是:

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

另一种方法可能是:

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

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

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

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

问题

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

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

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

4

1 回答 1

0

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

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

  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);
       }
    }
于 2013-08-04T12:58:34.217 回答