функция onActivityResult(), когато дейността се създава отново?

Имам проблем: Когато правя снимка в моите приложения, моето приложение отваря приложението Камера и прави снимка, но при връщане на активността изглежда, че на устройството ми липсва памет и функцията 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"

ако обаче експериментирате достатъчно с кода си и стигнете до извода, че той е причинен от унищожаването на активността от 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, ако не е нула

    @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