Android: сохранение состояния приложения при переходе в «фон» - PullRequest
5 голосов
/ 22 января 2011

У меня сложное приложение для Android с приличным количеством состояния приложения, которое необходимо сохранить (в определенном формате).Запись данных не является мгновенной операцией, и поэтому было бы идеально минимизировать сохранение ее без необходимости.

Из-за постоянных накладных расходов нецелесообразно сохранять состояние каждый раз, когда оно изменяется.В идеале, сохраняющееся состояние должно срабатывать, когда приложение «фоновое», когда пользователь нажимает кнопку «домой» или кнопку «назад» в корневой активности приложения (или при входящем звонке и т. Д.).Это сводит к минимуму накладные расходы при сохранении согласованности состояний с точки зрения пользователя.Вопрос в том, как определить, является ли приложение «фоновым»?

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

Так как приложение обнаруживает, когдаэто уходит на задний план?

Ответы [ 5 ]

4 голосов
/ 05 октября 2012

Если вы хотите сохранить какое-либо состояние, когда любое из ваших действий переходит в фоновый режим, вы всегда можете расширить Activity, добавьте два абстрактных метода, которые вы вызываете в onPause и onResume. Тогда каждая из ваших Деятельностей, которая расширяет этот новый абстрактный класс, будет вынуждена определять saveState () и loadState (). Эти методы могут определять, что сохранять и загружать для каждого действия.

Это всего лишь пример использования наследования, чтобы заставить ваших программистов реализовать методы, которые упускаются из виду, и методы. Вы можете просто сказать своим программистам, что если вам когда-нибудь понадобится сохранить состояние действия, просто продлите этот тип действия, и тогда IDE отправит их по пути вашего проекта.

package com.yourcompany.yourpackage;

import android.app.Activity;

public abstract class ActivitySaveState extends Activity{

    @Override
    protected void onPause() {
        super.onPause();
        saveState();
    }

    @Override
    protected void onResume() {
        super.onResume();
        loadState();
    }


    public abstract void loadState();
    public abstract void saveState();



}

Также вы можете создать для них некоторые механизмы сохранения состояния в суперклассе (например, конечную точку веб-службы, DAO или, возможно, с вашим модулем персистентности.

@Override
    protected void onResume() {
        super.onResume();
        saveState();

        CustomDataAccessObject dao = new CustomDataAccessObject("Activity3");

        loadState(dao );
    }


    public abstract void loadState(CustomDataAccessObject dao);
2 голосов
/ 06 апреля 2011

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

Кроме этого, на ваш вопрос:

MyXxxActivity.onPause - это последний надежный шанс запустить сохранение данных, которое должно сохраняться при различных «запусках» вашего приложения.Это не переходное состояние приложения, вместо этого это материал, который отправляется в хранилище БД / файловой системы и который вы хотите получить снова при следующем запуске.

Я предполагаю, что упомянутое вами состояние приложения попадает в эту категорию.

Таким образом, ваше сохранение должно быть вызвано каждой операцией onPause.Если какое-либо состояние совместно используется разными действиями (например, в приложении), оно должно быть собрано с каждой onPause.Или его сохранение должно запускаться также с каждой onPause.

Если операция сохранения занимает много времени, не следует запускать ее в основном потоке (пользовательском интерфейсе).Вместо этого вы должны передать его в другой поток.Опять же, если это важное состояние, которое вы делаете хотите сохранить, то лучше передать эту работу в службу (в отличие от AsyncTask, например).

0 голосов
/ 03 ноября 2014

Эта ветка довольно старая, просто сказать, что onSaveInstanceState активности запускается, когда приложение находится в фоновом режиме или когда пользователь нажимает кнопку «домой» на устройстве. Таким образом, вы можете сохранить состояние, загрузить его, восстановить и так далее ...

0 голосов
/ 22 января 2011

Я предлагаю управлять вашими данными по каждому виду деятельности.Это предлагается в документации для Android.

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

0 голосов
/ 22 января 2011

The Activity lifecycle calls (onStart, onResume, onPause and friends) don't help as the app has many different activities

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

...