【问题标题】:onActivityResult() function when Activity is recreated?重新创建 Activity 时的 onActivityResult() 函数?
【发布时间】:2014-03-01 04:47:27
【问题描述】:

我有一个问题:当我在我的应用程序中拍照时,我的应用程序打开相机应用程序并拍照,但是当返回 Activity 时似乎我的设备内存不足并且调用了 onCreate() 函数。 在这种情况下 onActivityResult() 在 onCreate() 之前调用还是 onCreate() 在 onActivityResult() 之前调用? Activity的@Override函数有时序图吗?

    public void dispatchTakePictureIntent(int actionCode) {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File dir= new File("/sdcard/Test/");
    dir.mkdir();
    String fileName = "IMG_"+System.currentTimeMillis()+".JPG";
    GlobalData.IMAGE_PATH_CAMERA = "/sdcard/Test/"+fileName;
    File output= new File(dir, fileName);
    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(output));
    startActivityForResult(takePictureIntent, 1);
}

提前致谢,

【问题讨论】:

标签: java android android-activity oncreate onactivityresult


【解决方案1】:

再次调用 onCreate() 的原因并不总是因为您的设备内存不足,最常见的原因之一是方向更改导致活动重新创建,因此您可以尝试将其放入清单中文件:

android:screenOrientation="portrait"
android:configChanges="orientation|keyboardHidden|screenSize"

但是,如果您对代码进行了足够多的实验并得出结论,这是由于 android 因内存不足而破坏 Activity 造成的,那么这里有一个解决方法,您可以使用它来正确恢复您的 Activity。

YourObject mObject;
    .
    .
    .

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        mObject.setImageUri(bla..); //Store image Uri and other values in mObject
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);

        if (mObject != null) {
            //save your object which contains data like image uri
            savedInstanceState.putSerializable(KEY, mObject);
        }
    }

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        YourObject obj = (YourObject) savedInstanceState.getSerializable(KEY);

        if(obj != null)
            mObject = obj;
    }

最后,在 onResume 中,如果 mObject 不为空,则从 mObject 中读取存储的数据

    @Override
    protected void onResume() {
        super.onResume();

        if(mObject != null) {
            //set image to imageView using the stored Uri
            setImage(imageView, mObject.getImageUri());
        }
    }

顺序:

    OnResume
    OnPause
    OnSaveInstanceState - Here we save our data in bundle
    OnDestroy - Here we lose all our activity data
    OnCreate
    onRestoreInstanceState - Here we restore our saved data from bundle if any
    OnResume - Here we deal with restored data if any

【讨论】:

    【解决方案2】:

    您的问题在此处的另一个 SO 问题中得到了回答:https://stackoverflow.com/a/5060245/2898715

    在我的应用中,我得到以下工作流程:

       onCreate
       onStart
       onRestoreInstanceState
       onActivityResult
       onResume
    

    所以,是的,onActivityResult 是在 onRestoreInstanceState 之后调用的,所以你可以指望状态已经完全恢复(除非你在 onResume 中做某事)。

    如果您的 Activity 在后台没有被操作系统杀死,那么我认为它的状态是相同的,所以您无需担心。 :)

    【讨论】:

      猜你喜欢
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      相关资源
      最近更新 更多