2013-05-30 3 views
0

Может кто-нибудь объяснить, почему у меня такое странное поведение. До документации Bundle savedInstanceState, который установлен в onSaveInstanceState(), жив до тех пор, пока приложение живое, поэтому, когда оно находится на переднем плане или на заднем плане. После того, как приложение будет убито, также уничтожается экземпляр savedInstanceState. Вот что у меня есть:Жизненный цикл приложения и Bundle savedInstanceState

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     if (savedInstanceState != null) { 
      Log.i("Dev", "not null"); 
     } else { 
      Log.i("Dev", "null"); 
     } 
    } 

Вот как я установил его:

@Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putBoolean("bool", true); 
    } 

Затем я начинаю приложение в эмуляторе. После того, как приложение открыто, нажмите кнопку home, чтобы открыть Launcher. Затем я убиваю процесс приложения с помощью adb. После этого я запускаю приложение из списка недавно использованного приложения, ожидающего «null» в Logcat, но я действительно вижу «не null», поэтому мое понимание неверное?

+0

documentaion says Если операция была повторно инициализирована после того, как она была закрыта, тогда этот пакет содержит данные, которые он недавно предоставил в onSaveInstanceState (Bundle). – Blackbelt

+0

Итак, я могу полагаться на информацию, которую я там размещаю, по-прежнему доступен после того, как приложение убито? – Eugene

+0

imo неясно. Иногда документация действительно вводит в заблуждение. – Blackbelt

ответ

0

The Bundle сохраняется до тех пор, пока Android хочет, чтобы он был сохранен/может его сохранить. Одна из «функций» (цитаты из-за того, что она заканчивается плохой идеей, так же часто, как и хорошая) Android - это то, что приложения никогда не выходят (с точки зрения пользователя). Их механизм заключается в onSaveInstanceState - он хранит Bundle, и когда приложение впоследствии повторно инициализируется каким-либо методом (например, из недавнего меню действий), он передает этот Bundle в onCreate и позволяет ему повторно инициализировать себя.

Конечно, это также вызывает проблемы. Например, если вы сохраняете данные для входа в систему, выход из приложения не выйдет из системы. Таким образом, пользователь может просто передать свой телефон другу, чтобы посмотреть видео, считая, что он вышел из своего приложения для мобильного банкинга, и он безопасен, но друг может вызвать его обратно и воссоздать. Если ваше приложение имеет большие структуры данных в статических переменных или синглонах, они не будут воссозданы, если вы не закодируете его внимательно. Приложения, для которых требуются действия, которые нужно изучить в порядке, можно перезапустить с середины.

Теперь Android может забыть ваш комплект. Если вы поместили в него несколько МБ, я бы ожидал, что Android будет быстро забыть об этом. Но он будет помнить об этом до тех пор, пока это возможно.

0

Не так ли четко указано here? Или я не понимаю ваш вопрос?

[..]To save additional data about the activity state, you must override the onSaveInstanceState() callback method. The system calls this method when the user is leaving your activity and passes it the Bundle object that will be saved in the event that your activity is destroyed unexpectedly. If the system must recreate the activity instance later, it passes the same Bundle object to both the onRestoreInstanceState() and onCreate() methods.

Saved Instance Life cycle

Я имею в виду для меня это также разумно в большинстве ситуаций. Потому что, когда ваше действие/приложение находится в фоновом режиме, и система Android закрывает его (скажем, потому что ему требуется больше памяти), тогда он сначала сохраняет состояние. Итак, в следующий раз, когда пользователи откроют вашу деятельность, вы можете восстановить ее прежнее состояние (и это может быть точно так, как хочет пользователь, так как это не он закрыл активность, а сама система).

+1

Но приложение заканчивается вручную, используя 'adb' – Geros

+0

ну, я думаю,' onDestroyed' также вызывается при завершении приложение вроде этого? –

+0

@ OschtärEi № 'onDestroy()' не вызывается, если процесс размещения приложения убит. Никакие методы жизненного цикла не называются, все это просто исчезает. –

Смежные вопросы