【问题标题】:Does the intent used to create an activity stick around?用于创建活动的意图是否存在?
【发布时间】:2012-12-16 23:24:10
【问题描述】:

关于这个问题的更多信息。

我想知道如果我不杀死它,我在创建 Activity 的意图中传递的数据是否会保留。

示例: Activity A 使用额外的数据 String(SomeStringValue) 调用 Activity B。 然后 Activity B 调用 C 调用 D。现在在这段时间的某个地方 Activity B 被销毁(例如为了节省内存),当我回到 Activity B 时,它需要重新创建(例如再次调用 onCreate)但是因为我使用过后退按钮而不是传递一个意图,我以前的意图仍然存在,我可以获得我需要的数据,或者这些数据会消失。

我自己尝试过测试,但我无法在不杀死整个应用程序的情况下再次调用 onCreate。

【问题讨论】:

  • 要对此进行测试,请转到开发人员选项,然后选中“不保留活动”选项。不过记得关掉它,因为太多的应用程序坏了。如果以后没有人回答这个问题,我会为你验证。
  • 如果你没有在你的活动中做一些特别的事情,一个简单的重新创建它的方法是改变设备的方向(例如,从纵向到横向)。
  • @Mikedg 不保留活动是否表现得像您正在杀死它们? (因为某些按钮,如返回和“主页”(这是一个使用 onActivityResult 返回第一个活动的按钮)

标签: android android-intent android-activity oncreate


【解决方案1】:

如上所述,我通过进入开发人员选项并打开“不保留活动”进行了测试。

使用这种方法,我发现当一个活动从内存中删除时,原始 Intent 仍然存在。

当我离开活动时,会立即调用 onDestroy。当我回到原来的活动时 onCreate 被调用,在 Intent 中的值与最初发送的值相同。

以下代码被用作我的测试平台。

public class MyActivity extends Activity {
/**
 * Called when the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    String extra = getIntent().getStringExtra("test");

    ((TextView) findViewById(R.id.test)).setText(extra);
}

public void onClick(View view) {
    Intent i = new Intent(this, MyActivity.class);
    i.putExtra("test", ""+Math.random());
    startActivity(i);
}

@Override
protected void onDestroy() {
    Log.d("Test", "onDestroy");
    super.onDestroy();    //To change body of overridden methods use File | Settings | File Templates.
}

}

因此要回答您的问题,在 onSavedInstanceState 中保存 Intent 数据是多余的。您应该只保存已更改或需要保留但不会永久保留的任何内容。

【讨论】:

  • 感谢您的信息。我也用 kill 活动尝试过它,当我保存实例状态时它一直在崩溃,但如果我不使用它就不会崩溃。
【解决方案2】:

如果调用了onDestroy() 方法,则所有意图数据都将丢失...您需要覆盖onSaveInstanceState() 方法并传递您的意图数据...之后在@ 987654323@ 只需检查 saveInstaceState 包是否为空...

这应该让您确定所有额外内容都将被保存,无论发生什么......

【讨论】:

  • 我不担心是否调用了 onDestroy(因为这通常意味着我希望活动结束)。我担心一个活动被杀死以释放一些内存,我也已经使用 onSaveInstanceState() 只是想知道在使用意图时使用 onSaveInstanceState 是否是多余的。
  • 您也可以尝试使用onLowMemory() 方法,但我不确定它是否正常工作...
  • 我虽然 onLowMemory 仅用于模拟器而不是设备。
  • This is called when the overall system is running low on memory, and would like actively running process to try to tighten their belt. 这是该方法的 javadoc
猜你喜欢
  • 2013-03-03
  • 2017-03-13
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多