Android Fragment正在销毁但仍接收onActivityResult

时间:2015-04-06 04:03:25

标签: android fragment onactivityresult

感谢这个回答Android Fragment lifecycle issue (NullPointerException on onActivityResult)我在调用startActivityForResult后在片段中收到NPE时,设法重新创建了一个场景。 所以我有

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, PHOTO_SELECT_REQUEST_CODE);
break;

从我的片段调用,然后我的活动接收onPause,onStop和onDestroy,因此调用startActivityForResult的片段也会获得onDestroy。在我选择一个图像之后,我在我的活动上获得了一个新的onCreate,然后我在原始片段上获得了public void onActivityResult,现在已被销毁。

我的问题是,由于这是潜在的(虽然很少见)情况,如何恢复传递给它们的整个片段和对象,以及如何防止原始片段泄漏?

1 个答案:

答案 0 :(得分:1)

当您的代码执行以下行时:

startActivityForResult(photoPickerIntent, PHOTO_SELECT_REQUEST_CODE);

您的活动每次都会获得onPause()onStop()但不会onDestroy()。如果在运行时android系统内存不足,那么您的活动可能会获得onDestroy()

用于保存片段和活动的状态并防止泄漏:

将您的州保存在onSaveInstanceState(Bundle)

  

在系统需要更多内存的情况下,它可能会杀死暂停的进程(在onPause()之后)以回收资源。因此,您应该确保在从此函数返回时保存所有状态。通常onSaveInstanceState(Bundle)用于保存活动中的每个实例状态,此方法用于存储全局持久性数据(在内容提供者,文件等中)

onRestoreInstanceState(Bundle)

中恢复您的状态
  当onRestoreInstanceState(Bundle)onStart()中的先前保存状态重新初始化活动时,会在savedInstanceState之后调用<onCreate(Bundle)方法。大多数实现只是使用onSaveInstanceState(Bundle)来恢复它们的状态,但有时在完成所有初始化之后在此处执行它或者允许子类决定是否使用默认实现是方便的。此方法的默认实现执行先前已被{{1}}冻结的任何视图状态的恢复。

这可以帮助您实现您的要求