Какво има наCreate(Bundle savedInstanceState)

Може ли някой да ми помогне да знам за Bundle savedInstanceState в onCreate(Bundle savedInstanceState) Аз съм начинаещ в Android. Опитвам се да го разбера от developer.android.com. Но не мога да разбера. Може ли някой да го опрости?


person user1077015    schedule 30.05.2012    source източник
comment
Това е добро видео: youtube.com/watch?v=kkYIMZw9gzQ   -  person Francisco Corrales Morales    schedule 13.01.2015
comment
Само като справка от първа ръка, оставям това тук: разработчик. android.com/guide/components/activities/   -  person carloswm85    schedule 27.11.2020


Отговори (6)


Ако запишете състоянието на приложението в пакет (обикновено непостоянни, динамични данни в onSaveInstanceState), то може да бъде предадено обратно на onCreate, ако дейността трябва да бъде пресъздадена (напр. промяна на ориентацията), така че да не загубите тази предварителна информация. Ако не са предоставени данни, savedInstanceState е нула.

... трябва да използвате метода onPause(), за да запишете всички постоянни данни (като потребителски редакции) в хранилището. В допълнение, методът onSaveInstanceState(Bundle) се извиква преди поставяне на активността в такова фоново състояние, което ви позволява да запазите всяко динамично състояние на инстанция във вашата дейност в дадения пакет, за да бъде получен по-късно в onCreate(Bundle), ако дейността трябва да се създаде отново. Вижте раздела Жизнен цикъл на процеса за повече информация относно това как жизненият цикъл на процес е свързан с дейностите, които хоства. Обърнете внимание, че е важно да запазите постоянни данни в onPause() вместо onSaveInstanceState(Bundle), тъй като последният не е част от обратните извиквания на жизнения цикъл, така че няма да бъде извикан във всяка ситуация, както е описано в неговата документация.

източник

person Dhruv Gairola    schedule 30.05.2012
comment
други дейности споделят ли същия пакет?, ако започна друга дейност, предава ли пакета от първия? - person Francisco Corrales Morales; 13.01.2015

onCreate(Bundle savedInstanceState) ще получите Bundle null, когато дейността започне за първи път и тя ще се използва, когато ориентацията на дейността се промени .......

http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html

Android предоставя друг елегантен начин за постигане на това. За да постигнем това, трябва да заменим метод, наречен onSaveInstanceState(). Платформата Android позволява на потребителите да запазват всяко състояние на инстанция. Състоянието на екземпляра може да бъде запазено в пакета. Пакетът се предава като аргумент на метода onSaveInstanceState.

можем да заредим запазеното състояние на екземпляр от пакета, предаден като аргумент на метода onCreate. Можем също да заредим запазеното състояние на екземпляр в метода onRestoreInstanceState. Но ще оставя това на читателите да разберат.

person Dheeresh Singh    schedule 30.05.2012
comment
savedInstanceState ще бъде не-null, ако onSavedInstanceState() е бил извикан преди това. промените в ориентацията са само един пример, в който това може да се случи. - person Alex Lockwood; 30.05.2012
comment
@AlexLockwood, опитвам се да измисля всички ситуации, в които това може да се случи. Има ли някаква документация? Един пример, за който се сещам, е, ако потребителят превключи приложения и се върне, но активността е унищожена за възстановяване на ресурси. В този случай android ще пресъздаде активността с пакет, ако onSaveInsanceState() е бил заменен, нали? - person batbrat; 29.03.2014
comment
@batbrat Да... коментарът, който направих (преди почти две години) не е съвсем коректен. Предполагам, че най-добрият начин да го кажа е, че аргументът Bundle към onCreate(Bundle) ще бъде не-null ако и само ако Activity е извикал преди това метода onSaveInstanceState. Това се случва по време на промени в ориентацията... и също се случва, когато активността се възобнови, след като е била унищожена от операционната система, и когато задействате друга промяна на конфигурацията, която представлява интерес на вашето устройство. - person Alex Lockwood; 30.03.2014
comment
Благодаря за уточнението Алекс. Хубаво е да има малко яснота по темата. Бях забравил за промените в конфигурацията, различни от превключвателите за ориентация в частност. - person batbrat; 30.03.2014

Както Dhruv Gairola отговори, можете да запазите състоянието на приложението, като използвате Bundle savedInstanceState. Опитвам се да дам много прост пример, който новите учащи като мен могат лесно да разберат.

Да предположим, че имате прост фрагмент с TextView и бутон. Всеки път, когато щракнете върху бутона, текстът се променя. Сега променете ориентацията на вашето устройство/емулатор и забележете, че сте загубили данните (означава променените данни след щракване, които сте получили) и фрагментът започва отново като първия път. С помощта на Bundle savedInstanceState можем да се отървем от това. Ако надникнете в жизнения цикъл на фрагмента.Fragment Lifecylce ще получите, че методът "onSaveInstanceState" се извиква, когато фрагментът е на път да бъде унищожен.

Така че можем да запазим състоянието означава променената текстова стойност в този пакет по този начин

 int counter  = 0;
 @Override
 public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("value",counter);
 }

След като направите ориентацията, методът "onCreate" ще бъде извикан, нали? така че можем просто да направим това

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

    if(savedInstanceState == null){
        //it is the first time the fragment is being called
        counter = 0;
    }else{
        //not the first time so we will check SavedInstanceState bundle
        counter = savedInstanceState.getInt("value",0); //here zero is the default value
    }
}

Сега няма да загубите стойността си след ориентацията. Променената стойност винаги ще се показва.

person Asad    schedule 30.07.2016
comment
Забележете, че това важи и за Activity. Можете ли да обясните повече за разликата между (Bundle of Activity) и Bundle of Fragment? - person laalaguer; 21.04.2017
comment
Можете да получите ясно разбиране от жизнените цикли на дейността и фрагмента, където една дейност може да показва множество фрагменти наведнъж. Така че основната разлика е, че може да искате да запазите някои стойности за всички фрагменти на дейност, тогава ще използвайте пакета от дейности, в противен случай трябва да използвате пакет от фрагменти, ако е за конкретен фрагмент. - person Asad; 21.04.2017

onCreate(Bundle savedInstanceState) Функция в Android:

  1. Когато дадено действие първо се извика или стартира, тогава методът onCreate(Bundle savedInstanceState) отговаря за създаването на дейността.

  2. Когато някога ориентацията (т.е. от хоризонтална към вертикална или вертикална към хоризонтална) на дейността бъде променена или когато дадена дейност бъде прекратена принудително от която и да е операционна система, тогава savedInstanceState, т.е. обектът на Bundle Class ще запази състоянието на дадена дейност.

  3. След промяна на ориентацията тогава onCreate(Bundle savedInstanceState) ще извика и пресъздаде дейността и ще зареди всички данни от savedInstanceState.

  4. По принцип класът Bundle се използва за съхраняване на данните за дейността, когато горното условие възникне в приложението.

  5. onCreate() не се изисква за приложения. Но причината да се използва в приложението е, че този метод е най-доброто място за поставяне на код за инициализация.

  6. Можете също така да поставите кода си за инициализация в onStart() или onResume() и когато приложението ви се зареди първо, то ще работи по същия начин като в onCreate().

person Abhi    schedule 21.01.2018

onCreate(Bundle) се извиква при първото стартиране на дейността. Можете да го използвате за извършване на еднократна инициализация, като например създаване на потребителски интерфейс. onCreate() приема един параметър, който е или нулев, или някаква информация за състояние, запазена преди това от onSaveInstanceState.

person Community    schedule 01.12.2013

onCreate(Bundle savedInstanceState) се извиква и savedInstanceState няма да бъде нула, ако вашата активност и тя е прекратена в сценарий (визуален изглед), описан по-горе. След това вашето приложение може да вземе (улови) данните от savedInstanceState и да генерира повторно вашата активност

person kabilan    schedule 05.03.2014