拍照导致Activity 退出

冰冰的冻结
  • 519

启动相机代码:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile));
startActivityForResult(intent, CAMERA);

以下是我通过给 OnCreate OnDestory 生命周期方法打日志测试出来的结果,测试机小米PAD:
Activity 启动相机

然后Activity 就执行OnDestory 退出了

Activity 又重新执行了OnCreate 方法

紧接着 OnActvityResult 方法被调用了
imageFile 为 null 拍照失败

通过观察studio 内存区域发现app 占用的内存很高,打开相机拍照后为什么会把当前Activity 退出呢?? 大神遇到过这样的问题吗??

回复
阅读 4.6k
2 个回答
符宏梁
  • 62
 /**
  * 保存相册参数
  * 说明:对于配置低的手机,开启照相机时,
  * 当前activity会被回收,导致再次返回该activity时,原先保存
  * 的变量被重新初始化,导致程序无法运行,造成崩溃。
  * 此处需要记录相关变量信息,如果activity异常退出,
  * 再次进入时调用onRestoreInstanceState函数就可以恢复这些变量的值。
  */
  
 @Override
 protected void onSaveInstanceState(Bundle outState) {
     super.onSaveInstanceState(outState);
     Log.i(TAG, "onSaveInstanceState");
 /* 保存相片路径 */
 outState.putString("mCurrentSelectPictureCachePath", mCurrentSelectPictureCachePath);   
 }


 /**
  * 恢复相册参数
  */
 @Override
 protected void onRestoreInstanceState(Bundle savedInstanceState) {

     super.onRestoreInstanceState(savedInstanceState);
     Log.i(TAG, "onRestoreInstanceState");
     /* 恢复当前相片存储路径 */
     mPictureCachePath = savedInstanceState.getString("mCurrentSelectPictureCachePath", mCurrentSelectPictureCachePath);

 ......
 }
 

这两个方法并不是Activity每次都会调用的,我们注意到onCreate和onRestoreInstanceState都有个Bundle类型的参数,那么这个参数是谁传来的呢?肯定是onSaveInstanceState传来的。

当我们的Activity在未经我们自己finish的情况下被结束(没有被回收也会执行onSaveInstanceState),onSaveInstanceState方法就会被调用。此时我们就可以利用outState参数来存储我们的数据,当onCreate或者onRestoreInstanceState(只有Activity被真正回收后才调用)时,将这些数据拿出来重新赋值给我们的成员变量,这样,就算是Activity被销毁了,我们依然可以重新获得相关变量的值。

有可能是启动相机拍照时占用内存过大,导致LMK把后台的进程给杀掉了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏