2011-02-06 58 views
2

我在处理onCreate活动从检索意图值,并用它做什么如何更新此活动将从后台恢复后开始的意图?

protected void onCreate(Bundle b){ 
    .... 
    Intent i = getIntent(); 
    if (i.hasExtra("value")){ 
     String val = i.getStringExtra("value"); 
     doSomethingWithValue(val); 
    } 
} 

请注意,我的活动有明显的属性android:launchMode="singleTask"。 执行doSomethingWithValue我想清除"value"额外的意图,所以当下次活动正在从后台恢复意图返回但getIntent()不应该有"value"额外。如何在下一次执行onCreate时清除该值? setIntent在这里不起作用。

换句话说,当我按回按钮,然后返回到我的应用程序doSomethingWithValue(val)再次执行,但我不需要这个。

+0

我遇到同样的问题。请让我知道你是否设法找到解决方案。 – 2015-10-08 21:52:18

回答

1

我不知道Intents是否可以改变,虽然这个概念对我来说似乎是错误的(这是毕竟Intent开始了你的活动,并没有改变)。

我建议将doSomethingWithValue()的成功执行存储在属性中,比如mSomethingDone。当系统(而不是用户)关闭活动时,调用onRetainNonConfigurationInstance。实现一个:

@Override 
public Object onRetainNonConfigurationInstance() { 
    return mSomeThingDone; 
} 

现在检索布尔在你的onCreate:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    final Object data = getLastNonConfigurationInstance(); 
    if (data != null) { 
    mSomeThingDone = (Boolean)data; 
    } 
} 

然后检查是否需要根据mSomeThingDone的价值来运行你的doSomethingWithValue。

+0

当我通过主页按钮将应用程序移动到背景时,这种方法有效,但当我通过后退按钮将应用程序移动到背景时,行为仍然像以前一样错误。 – Solvek 2011-02-06 14:00:21

+0

您应该在这里考虑活动生命周期(http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle)。应用程序在进入后台时很少被销毁。如果它们没有被销毁,当它们再次被发送到前台时,onCreate不会被调用。我建议通过将日志语句添加到onCreate,onResume和onStart来创建日志,恢复和启动事件。检查问题出现时是否调用onCreate。 – 2011-02-06 16:26:23