我正在开发使用相机的手机应用程序。在内存不足的情况下,当相机启动时,我的应用程序被系统杀死,有时不调用onDestroy()方法(现在我知道只保证onPause())。
我可以覆盖onPause()方法(在javascript或java中)来存储应用状态,并在重新启动应用时恢复它。问题是图片文件uri丢失了,我的应用程序无法获取它。
当相机返回图片uri并且我的应用程序被杀死时,你知道Android中有什么方法可以调用我的回调函数吗?任何解决方法?
我认为这个问题对于使用startActivityForResult()的所有Android开发都很常见,但我还没有找到任何解决方案。
提前致谢; - )
答案 0 :(得分:0)
我的解决方案是将文件uri保存在SharedPreferences中并在onResume中恢复它。
我遇到了同样的情况:我有一个照片列表,按下照片列表中的一个相框将调用android原生相机应用程序来拍照。当从Android原生相机应用程序返回时,有时(如2%的使用率),图片不会像预期的那样显示在相框中。我很困惑,无法弄清楚发生了什么。直到我的一个同事在“开发人员选项”中设置“不保留活动”,并且一直遇到这个错误,然后我才知道这是一个活动被杀的问题。
以下是一些演示我的解决方案的代码:
public static class PhotoOnClickListener implements OnClickListener {
...
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
activity.fileUri[index] = getOutputMediaFileUri(MEDIA_TYPE_IMAGE, "xxxxxx");
activity.saveKeyValue("game_photo_list_file_uri_" + index, activity.fileUri[index].toString());
intent.putExtra(MediaStore.EXTRA_OUTPUT, activity.fileUri[index]);
activity.startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
...
}
private void tryRecoverFromBeingKilledOfLowMemory() {
String s;
for (int i = 0; i < fileUri.length; i++) {
s = readKey("game_photo_list_file_uri_" + i);
if (s != null) {
fileUri[i] = Uri.parse(s);
updatePhoto(i);
}
}
}
@Override
protected void onResume() {
super.onResume();
if (readKey("from_game_main") != null) {
removeKeysPrefixedBy("game_photo_list");
removeKey("from_game_main");
removeKey("uploader_id");
}
tryRecoverFromBeingKilledOfLowMemory();
}
在代码中:
希望它有所帮助。
答案 1 :(得分:0)
在startActivity之前,尝试在保存的意图上设置一个标志来表示它,而不是杀死并重新启动它:
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);