Используя 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 не сохранит текущее состояние активности

Вы должны переопределить onSaveInstanceState(Bundle savedInstanceState)

Пожалуйста, проверьте этот ответ для примера кода

Или использовать SharedPreferences, Проверьте этот код

Если вы хотите сохранить свои данные только во время выполнения, рассмотрите возможность использования статических членов. Затем вы можете получить доступ к этим членам и манипулировать ими из любых активностей. например:

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);
        }
    }
}

Конечно, вы можете добавить функции получения / установки, чтобы сделать его более безопасным и элегантным.

Если вы хотите хранить их в течение более длительного времени, рассмотрите возможность использования:

Другие вопросы по тегам