每当调用startActivityForResult时,Android会关闭我的应用程序

3

好的,在我的应用程序中,我正在使用Android的默认相机和图库,并使用startActivityForResult方法;

Intent i = new Intent("android.intent.action.PICK",
                       MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
i.setType("image/*");
startActivityForResult(i, this.SELECT_PICTURE);

我也能捕获onActivityResult。然而,如果内存不足并且我启动此活动,则系统会杀死我的父活动,即使活动返回值,我也会失去所有本地变量(并且onCreate()会再次调用)。只有应该再次调用onResume()。
我尝试了几次,我很确定它与内存问题有关。如果有足够的内存,进程将成功执行。如何防止这种行为?
由于Android不会杀死前台应用程序,我仍然可以使用此功能吗?我认为我的问题与this one几乎相似。

解决方案

除了Yahel提供的解决方案外,以下方法也可以使用。

@Override
public void onSaveInstanceState(Bundle savedInstanceState){
   super.onSaveInstanceState(savedInstanceState);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState){
   super.onRestoreInstanceState(savedInstanceState);
}
2个回答

9
你需要阅读必读的"在编码之前"文章:http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle
如果内存不足,Android 会杀死你的活动。但是它会通知你,并有一种非常明确定义的处理方式。
这就是为什么所有的活动都需要在oncreate方法里传入Bundle savedInstanceStatepublic void onCreate(Bundle savedInstanceState) 在你的应用程序onpause时,你应该保存所有需要重新创建应用程序状态的信息。在应用程序oncreate时,你应该检查是否有完整的savedInstanceState并从中恢复你的应用程序。
祝好运。

1
你有没有考虑使用某种类型的持久存储?在调用新意图之前,将需要保存的数据保存在持久性存储中(共享首选项、db、文件系统等),并带有某种重建标志。然后,如果活动调用onCreate并且标志已启用,则可以恢复以前的活动状态。确保在不需要时清除重建标志,在onResume中应该清除。
编辑: 对于活动本地的数据,似乎 onSaveInstanceState 是一种方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接