在低内存情况下如何使用startActivityForResult()函数

4
我正在开发一个使用相机的PhoneGap应用程序。在低内存情况下,当启动相机时,我的应用程序会被系统杀死,有时甚至没有调用onDestroy()方法(现在我知道只有onPause()是保证会被调用的)。
我可以重写onPause()方法(使用JavaScript或Java)来存储应用程序状态,并在应用程序重新启动时恢复它。问题是图片文件URI丢失了,我的应用程序无法获取它。
你知道在Android中是否有任何方法可以在相机返回图片URI并且我的应用程序已经被杀死时回调我的回调函数吗?有什么解决办法吗?
我认为这个问题对所有使用startActivityForResult()的Android开发都是普遍存在的,但我还没有找到任何解决方案。
谢谢!
2个回答

0
在调用startActivity之前,尝试在保存的Intent上设置一个标志来显示它,而不是杀死并重新启动它:
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

请查看我的帖子:https://dev59.com/s2sy5IYBdhLWcg3wtwQd#29630548


0

我的解决方案是将文件URI保存在SharedPreferences中,并在onResume中恢复它。

我遇到了同样的情况:我有一个照片列表,点击其中一个照片框架会调用Android原生相机应用程序拍照。有时(例如使用率的2%),从Android原生相机应用程序返回时,图片不像预期那样显示在相应的照片框架中。我感到困惑,无法弄清楚发生了什么。直到我的一位同事在“开发人员选项”中设置“不保留活动”,并且一直遇到这个错误,我才知道这是活动被杀死的问题。

以下是一些代码,以演示我的解决方案:

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. readKey、saveKeyValue、removeKey、removeKeysPrefixedBy是从CommonActivity继承而来的,作为SharedPreferences的常见操作。
  2. 来自from_game_main的键表示当前恢复是正常的,并且应该以空照片列表开始。from_game_main键在GameMainActivity中的startActivity之前保存。否则,当前恢复是由于低内存被杀死的恢复。
希望能有所帮助。

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