我正在开发的应用程序中至少有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”不为空时忽略标志是否安全?
答案 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);
}
}