当Activity被重新创建时,onActivityResult()函数会发生什么?

3
我有一个问题:当我在我的应用程序中拍照时,我的应用程序会打开相机应用程序并拍照,但是当返回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);
}

感谢您的提前致谢,


请发布您的代码。 - Bhavesh Patadiya
2
请参见此链接:https://dev59.com/OGbWa4cB1Zd3GeqPTyzf - Gaurav
2个回答

2

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不为null,从中读取您存储的数据。
    @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

0

你的问题在这里的另一个SO问题中得到了回答:https://dev59.com/RlTTa4cB1Zd3GeqPs4HG#5060245

In my app I get the following workflow:

   onCreate
   onStart
   onRestoreInstanceState
   onActivityResult
   onResume

So, yes onActivityResult is called AFTER the onRestoreInstanceState, so you can count on the state has been fully restored (unless you do smth in onResume).

If your Activity was not killed by OS while it was in the background, then I assume its state is the same, so you have nothing to worry about. :)


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