onActivityResult() при воссоздании Activity?

У меня проблема: когда я делаю снимок в своих приложениях, мое приложение открывает приложение «Камера» и делает снимок, но когда возвращается активность, кажется, что на моем устройстве мало памяти, и функция onCreate() вызывается. В этом случае onActivityResult() вызывается до onCreate() или onCreate() вызывается до onActivityResult()? Есть ли диаграмма последовательности для функции @Override Activity?

    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);
}

Заранее спасибо,


person nguoitotkhomaisao    schedule 01.03.2014    source источник
comment
Пожалуйста, опубликуйте свой код.   -  person Bhavesh Patadiya    schedule 01.03.2014
comment
см. это - stackoverflow.com/questions/11507999 /   -  person Gaurav    schedule 01.03.2014


Ответы (2)


Причина, по которой onCreate() вызывается снова, не всегда связана с тем, что на вашем устройстве недостаточно памяти. Одной из наиболее распространенных причин является изменение ориентации, которое вызывает воссоздание активности, поэтому вы можете попробовать поместить это в свой файл манифеста:

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

однако, если вы достаточно поэкспериментировали со своим кодом и пришли к выводу, что это вызвано тем, что андроид уничтожает активность из-за нехватки памяти, то вот обходной путь, который вы можете использовать для правильного восстановления своей активности.

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, если они не нулевые.

    @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
person Obaidah    schedule 08.06.2015

на ваш вопрос ответили в другом вопросе SO здесь: https://stackoverflow.com/a/5060245/2898715

В моем приложении я получаю следующий рабочий процесс:

   onCreate
   onStart
   onRestoreInstanceState
   onActivityResult
   onResume

Итак, да, onActivityResult вызывается ПОСЛЕ onRestoreInstanceState, поэтому вы можете рассчитывать на то, что состояние было полностью восстановлено (если вы не сделаете что-то в onResume).

Если ваша активность не была уничтожена ОС, пока она была в фоновом режиме, то я предполагаю, что ее состояние такое же, поэтому вам не о чем беспокоиться. :)

person Eric    schedule 15.11.2019