onPause/onRestore с сохраненнымInstanceState

Я новичок в разработке Android, и мне нужна помощь в сохранении состояния активности. Каков правильный способ сохранить экземпляр из onPause и восстановить его из onRestore, поскольку, очевидно, Android не отправляет пакет saveInstanceState, как это происходит, например, с onCreate или onSaveInstanceState. Или есть лучший способ сохранить, кроме использования пакета saveInstanceState?

Имеет ли это смысл?

[править] Хорошо, я думаю, что знаю, в чем моя настоящая проблема... Но сначала я думаю, что я искал использование SharedPreferences вместо saveInstanceState.

Итак, наблюдая за журналом отладки, я заметил, что вместо того, чтобы вывести действие на вершину стека, оно создает новое. Да, я понимаю, что создаю новый....

         Intent itemintent = new Intent(MediaList.this, AudioPlayer.class);

         Bundle b = new Bundle();
        //...putString some strings to send
         itemintent.putExtra("android.intent.extra.INTENT", b);
         itemintent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
         startActivityForResult(itemintent,0);

... Но разве FLAG_ACTIVITY_REORDER_TO_FRONT не должен мешать ему создавать новую активность? Я предполагаю, что он думает, что должен создать новый, так как я отправляю некоторые строки?

Еще лучше, как я могу проверить, находится ли действие уже в стеке, и переключиться на него, если строки одинаковы? -- Я запускаю это действие, когда пользователь щелкает элемент мультимедиа в списке. [/редактировать]


person bwoogie    schedule 25.04.2011    source источник


Ответы (2)


По какой-то причине это не задокументировано очень жирными неоновыми мигающими буквами, и мне потребовалось некоторое время, чтобы обнаружить, но вам не нужно беспокоиться о том, существует ли ваша активность или нет, если вы просто создаете ее с помощью android:launchMode=[ "множественный" | "синглтоп" | "однозадачный" | "singleInstance"] установлено значение "singleInstance".

Тогда есть только один его экземпляр, и ваши поля памяти сохраняются до тех пор, пока активность не будет удалена сборщиком мусора.

Другая вещь, которую вы можете сделать, это создать приложение (расширенное из приложения) и сохранить все ваши постоянные объекты в нем... оно создается первым и уничтожается последним, насколько это касается всего жизненного цикла вашего приложения (включая всю вашу активность -без услуг).

Просто создайте класс приложения и укажите его в своем манифесте следующим образом:

<application android:icon="@drawable/icon" android:label="@string/app_name"
    android:name=".MyApplication">

Затем, если вы все еще ДЕЙСТВИТЕЛЬНО хотите сохранить свои значения для ситуаций, когда приложение будет закрыто, просто используйте SharedPreferences.

person Yevgeny Simkin    schedule 26.04.2011
comment
Спасибо за ответ. Дал мне большие надежды, но он все еще создает новую активность после добавления android:launchMode=singleInstance в файл манифеста. Он не должен снова вызывать onCreate(), верно? х_Х - person bwoogie; 26.04.2011
comment
Вот это интересно... Кнопка назад на телефоне убивает активность? Потому что, если я нажму кнопку «Домой» и вернусь в приложение, оно будет работать правильно. - person bwoogie; 26.04.2011
comment
Да, bwoogie, кнопка «Назад» убивает активность (поэтому никакое сохранение/загрузка/что-либо еще не вернет ее), а кнопка «Домой» отправляет ее в фоновый режим. Мне это тоже поначалу было не очень понятно. - person dmon; 26.04.2011
comment
это правильно, он будет вызывать onCreate только один раз для действия, для которого установлено значение singleInstance. onResume — это последнее, что вызывается перед отображением вашей активности. Вызывается каждый раз (в том числе после onCreate) - person Yevgeny Simkin; 26.04.2011
comment
+1, и я хотел бы добавить очень жирными неоновыми мигающими буквами: по умолчанию launchMode является стандартным. - person ateiob; 09.08.2012

О каком onRestore методе вы говорите? Это не часть жизненного цикла Activity... Я предполагаю, что вы имеете в виду onRestart. В любом случае, причина, по которой вы не получаете комплект для onRestart, заключается в том, что он вам не нужен. Ваша активность не была официально «убита», поэтому вам не нужно восстанавливать ее из сохраненного состояния. Ваша активность была приостановлена, но не удалена из памяти, поэтому система просто сообщает вам, что она снова стала видимой. Вам, вероятно, не нужно ничего делать для такого рода переходного события.

Кроме этого, способ сделать это - сохранить все, что вы считаете значением «состояния», в onSaveInstanceState(), а затем восстановить их в onCreate. После этого вы можете восстановить любые свойства, относящиеся к представлению, либо в самом onCreate, либо позже в жизненном цикле Activity (например, onResume).

person dmon    schedule 25.04.2011
comment
Если он говорил о onPause, я бы поспорил, что он имел в виду onResume вместо onRestore. - person Amplify91; 26.04.2011
comment
Да, я имел в виду onResume, а не onRestore. Извиняюсь. - person bwoogie; 26.04.2011
comment
А, точка. Я думаю, что тот же принцип все еще применим. Вам важнее знать, что это произошло, чем спасать что-либо. Если вы имеете дело с поставщиком базы данных/контента, документация предлагает вам сохранять данные в нем при паузе, но с состоянием активности ничего не поделаешь. - person dmon; 26.04.2011
comment
Может быть, я должен был более четко указать, что я сохраняю. На самом деле это текущий воспроизводимый аудиофайл из онлайн-файла xml. Мне нужно проверить, покидает ли пользователь активность (пока звук все еще воспроизводится) и возвращается, если он выбрал другой файл или продолжил воспроизведение текущего и соответственно обновил проигрыватель. - person bwoogie; 26.04.2011
comment
Я понимаю проблему @bwoogie и искал решение, пока не отвлекся. @dmon: onPause нужно написать так, чтобы, если Android нуждался в ресурсах, он мог отнять память у исходной программы. Вы не можете предположить, что информация помещается в защищенное состояние... - person Rasman; 26.04.2011
comment
Можете ли вы привести пример, как сохранить пакеты в onPause ()? - person laplasz; 12.01.2013