onActivityResult()函数重新创建时?

问题描述 投票:2回答:2

我有一个问题:当我在应用程序中拍照时,我的应用程序打开相机应用程序并拍照,但是当返回活动时,我的设备内存不足,并且调用了onCreate()函数。在这种情况下,在onCreate()之前调用onActivityResult()或在onActivityResult()之前调用onCreate()?活动的@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
2个回答
1
投票

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

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

但是,如果您对代码进行了充分的实验,并得出结论,这是由于内存不足而导致android破坏了活动,那么您可以使用这里的解决方法来正确还原您的活动。

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,则从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

0
投票

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

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

   onCreate
   onStart
   onRestoreInstanceState
   onActivityResult
   onResume

所以,是,在onActivityResult之后称为onRestoreInstanceState,因此您可以指望状态已完全恢复(除非您在onResume中执行了某项操作)。

如果您的Activity在后台时未被操作系统杀死,那么我认为它的状态是相同的,因此您不必担心。 :)

© www.soinside.com 2019 - 2024. All rights reserved.