【问题标题】:startActivityForResult() in low memory situationsstartActivityForResult() 在内存不足的情况下
【发布时间】:2012-06-10 05:36:06
【问题描述】:

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

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

当相机返回图片uri并且我的应用程序已被杀死时,您知道Android中有什么方法可以调用我的回调函数吗?有什么解决方法吗?

我认为这个问题对于所有使用startActivityForResult()的android开发都是通用的,但是我没有找到任何解决方案。

提前致谢 ;-)

【问题讨论】:

    标签: android memory cordova callback android-camera-intent


    【解决方案1】:

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

    我也遇到过同样的情况:我有一个照片列表,在照片列表中按一个相框会调用android原生相机app拍照。有时(如 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,作为 SharedPrefeneces 的通用操作。
    2. from_game_main 键表示当前恢复正常,应以空照片列表开头。密钥 from_game_main 保存在 GameMainActivity 中的 startActivity 之前。否则,当前的恢复是从被低内存杀死的恢复。

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      在 startActivity 之前,尝试在已保存的 Intent 上设置一个标志来显示它,而不是杀死并重新启动它:

      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      

      在这里查看我的帖子:https://stackoverflow.com/a/29630548/2782404

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-29
        • 2012-01-26
        • 2010-11-22
        相关资源
        最近更新 更多