Используя onResume и onPause
Предположим, у меня есть два вида деятельности: активность 1 и активность 2. Я хочу перейти от действия 1 к занятию 2, получить некоторую информацию из занятия 2 и вставить ее обратно в занятие 1, а также не хочу потерять предыдущее состояние действия 1 после своего ухода. как я могу сохранить его состояние?
5 ответов
То, что вы описываете, является идеальной классической причиной для использования Activity.startActivityForResult()
метод.
это то, что Google написал в документации этого метода:
Запустите действие, для которого вы хотите получить результат, когда оно закончится. Когда эта операция завершается, ваш метод onActivityResult() будет вызываться с заданным кодом запроса.
Итак, что вы должны сделать, это: из вашей деятельности1 начать деятельность для результата, а из действия 2 использовать setResult(int resultCode, Intent data)
метод с данными, которые вы хотите, чтобы ваша активность вернулась, и вызовите finish()
(это вернется к onActivityResult()
в том же состоянии активность1 была раньше..).
Override onSaveInstanceState(Bundle)
в activity1
сохранить любые данные, которые вы хотите, а затем переопределить onRestoreInstanceState(Bundle)
в той же деятельности, чтобы вернуть значения. С помощью Bundle
, вы можете хранить практически любые данные, которые вы хотите. Я бы порекомендовал что-то вроде этого:
public class MainActivity extends Activity {
...
public static final String DATA1_KEY = "data1";
private boolean value1;
...
@Override
protected void onSaveInstanceState (Bundle outState) {
outState.putBoolean(DATA1_KEY, value1);
}
@Override
protected void onRestoreInstanceState (Bundle savedInstanceState) {
value1 = savedInstanceState.getBoolean(DATA1_KEY);
}
}
Пользователь выполняет действие в вашем приложении, которое запускает новое действие. Текущее действие останавливается при создании второго действия. Если пользователь затем нажимает кнопку "Назад", первое действие перезапускается.
Когда ваша деятельность остановлена, объект Activity сохраняется в памяти и вызывается при ее возобновлении. Вам не нужно повторно инициализировать компоненты, которые были созданы во время любого из методов обратного вызова, приводящих к состоянию "Возобновлено". Система также отслеживает текущее состояние для каждого представления в макете, поэтому, если пользователь ввел текст в виджет EditText, это содержимое сохраняется, поэтому вам не нужно его сохранять и восстанавливать.
Примечание. Даже если система уничтожает вашу деятельность, когда она остановлена, она все равно сохраняет состояние объектов View (например, текста в EditText) в Bundle (блок пар "ключ-значение") и восстанавливает их, если пользователь переходит назад к тому же экземпляру деятельности.
CommonsWare здесь говорит:
Когда пользователь "нажимает кнопку НАЗАД", то Bundle из onSaveInstanceState() (если есть) отбрасывается, так как пользователь указал, что он завершил действие. Пакет onSaveInstanceState () используется в тех случаях, когда пользователь еще не сказал, что завершил действие (например, он принял входящий телефонный звонок), а Android решает уничтожить действие, чтобы освободить ОЗУ.
И документация гласит:
Обратите внимание, что важно сохранять постоянные данные в onPause() вместо onSaveInstanceState(Bundle), потому что последний не является частью обратных вызовов жизненного цикла, поэтому не будет вызываться в каждой ситуации, как описано в его документации.
Другими словами, поместите свой код сохранения / восстановления для объектов, отличных от View, в onPause() и onResume() вместо onSaveInstanceState(Bundle) и onRestoreInstanceState(Bundle).Наконец, я предполагаю, что вам не нужно сохранять какое-либо состояние, если у вас есть только объекты View и если у вас есть другие состояния, которые вы можете использовать preferences
,file
или же sqlite
чтобы сохранить их в onPause()
и вернуть их в onResume()
,
Вы можете увидеть более подробную информацию на этих страницах:
Остановка и возобновление активности
Сохранение состояния активности в Android
Android не сохранит текущее состояние активности
Если вы хотите сохранить свои данные только во время выполнения, рассмотрите возможность использования статических членов. Затем вы можете получить доступ к этим членам и манипулировать ими из любых активностей. например:
public class FirstActivity extends Activity
{
public static String data = null;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(...);
data = "This is a test!";
}
}
Из второго занятия вы можете получить доступ к этим статическим переменным
public class SecondActivity extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(...);
if(FirstActivity.data!=null)
{
//You can use it:
System.out.println(FirstActivity.data);
}
}
}
Конечно, вы можете добавить функции получения / установки, чтобы сделать его более безопасным и элегантным.
Если вы хотите хранить их в течение более длительного времени, рассмотрите возможность использования:
- SharedPreferences
- SQLite
- или храните ваши данные в онлайн-базе данных.