Android 低内存情况下的startActivityForResult()

Android 低内存情况下的startActivityForResult(),android,memory,cordova,callback,android-camera-intent,Android,Memory,Cordova,Callback,Android Camera Intent,我正在开发一个使用摄像头的phonegap应用程序。在内存不足的情况下,当启动相机时,我的应用程序会被系统终止,有时不调用onDestroy()方法(现在我知道只有onPause()是有保证的) 我可以重写onPause()方法(在javascript或java中)来存储应用程序状态,并在应用程序重新启动时恢复它。问题是图片文件uri丢失,我的应用程序无法获取它 你知道在Android中,当相机返回图片uri,而我的应用程序被终止时,有什么方法可以调用我的回调函数吗?有解决办法吗 我认为这个问题

我正在开发一个使用摄像头的phonegap应用程序。在内存不足的情况下,当启动相机时,我的应用程序会被系统终止,有时不调用onDestroy()方法(现在我知道只有onPause()是有保证的)

我可以重写onPause()方法(在javascript或java中)来存储应用程序状态,并在应用程序重新启动时恢复它。问题是图片文件uri丢失,我的应用程序无法获取它

你知道在Android中,当相机返回图片uri,而我的应用程序被终止时,有什么方法可以调用我的回调函数吗?有解决办法吗

我认为这个问题在所有使用startActivityForResult()的android开发中都很常见,但我还没有找到任何解决方案


提前感谢;-)

我的解决方案是将文件uri保存在SharedReferences中,并在onResume中恢复

我遇到了同样的情况:我有一张照片列表,按下照片列表中的一个相框就会调用android原生摄像头应用程序来拍照。有时(比如2%的使用率)当从android原生摄像头应用程序返回时,图片不会像预期的那样显示在相框中。我很困惑,不知道发生了什么事。直到我的一个同事在“开发者选项”中设置了“不要保留活动”,并且一直遇到这个bug,我才知道这是一个活动被杀死的问题

下面是一些代码来演示我的解决方案:

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();
}
公共静态类PhotoOnClickListener实现OnClickListener{
...
意向=新意向(MediaStore.ACTION\u IMAGE\u CAPTURE);
activity.fileUri[index]=getOutputMediaFileUri(媒体类型图像,“xxxxxx”);
activity.saveKeyValue(“游戏、照片、列表、文件、uri”+索引,activity.fileUri[index].toString());
intent.putExtra(MediaStore.EXTRA_输出,activity.fileUri[index]);
activity.startActivityForResult(意图、捕获、图像、活动、请求、代码);
...
}
私有void tryrecoverfromBeingKilledFlowMemory(){
字符串s;
for(int i=0;i
在守则中:

  • readKey、saveKeyValue、removeKey、removeKeysPrefixedBy是从CommonActivity继承的,充当SharedPrefences的公共操作
  • _game_main中的键表示当前简历正常,应该以空照片列表开始。在GameMainActivity的startActivity之前,会保存来自\u game\u main的密钥。另一方面,当前恢复是从内存不足中恢复过来的

  • 希望它能有所帮助。

    在启动Tactivity之前,尝试在保存的意图上设置一个标志以使其显示,而不是终止并重新启动它:

    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    
    请看我的帖子: