Определение, работает ли приложение в фоновом режиме - PullRequest
3 голосов
/ 13 июля 2010

Как я могу узнать, что мое приложение было помещено в фоновый режим (то есть ни одно из действий моего приложения больше не отображается)?Мне нужно определить это так, чтобы я мог высвободить ресурсы, общие для нескольких моих действий (графика, звуковые клипы и соединение через сокет).

Я думал о том, чтобы сохранить глобальный счетчик, который увеличивается в onStart действий() и уменьшено в onStop ().Если счетчик достигает нуля, все действия были остановлены, и мое приложение работает в фоновом режиме.Однако я не уверен, что это будет на 100% надежно.Кроме того, я не могу не думать, что должен быть лучший способ сделать это.

Ответы [ 5 ]

2 голосов
/ 31 августа 2010

Вам не нужно знать это, но чтобы ответить вам:

в вашей основной деятельности:

public boolean inBackground;

@Override
public void onPause()
{
     inBackground=true;
     super.onPause();
}

@Override
public void onResume()
{
     inBackground=false;
     super.onResume();
}
1 голос
/ 25 августа 2010
0 голосов
/ 08 июня 2011

Я сам еще не пробовал, но думаю, что сработает следующее.

  • Создайте свой собственный класс Activity, который extends Activity (как предложено в этом вопросе SO ).
  • Убедитесь, что все ваши действия расширяют ваш пользовательский класс Activity.
  • @ Переопределить метод onStop() (согласно документам по жизненному циклу Activity ).
  • Попросите onStop() вызвать метод утилит ниже (код, основанный на проекте Droid-Fu ), чтобы выяснить, находится ли ваше приложение в фоновом режиме.

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

public static boolean isApplicationInBackground(Context context) 
{
    ActivityManager am = 
      (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

    List<RunningTaskInfo> tasks = am.getRunningTasks(1);

    if (!tasks.isEmpty()) 
    {
        ComponentName topActivity = tasks.get(0).topActivity;

        if (!topActivity.getPackageName().equals(context.getPackageName())) 
        {
            return true;
        }
    }

    return false;
}

Дайте нам знать, как вы поживаете, так как мне может понадобиться реализовать и эту функцию!

Обновление: Я провел небольшое быстрое тестирование этого кода.

Кажется, что он работает нормально при нажатии клавиши «Домой» для выхода из приложения, поскольку на моем устройстве текущее задание изменяется на ComponentInfo{com.motorola.blur.home/com.motorola.blur.home.HomeActivity}. Однако код не определяет приложение как фоновое при использовании кнопки «Назад» для выхода из приложения (он по-прежнему считает, что мое приложение работает).

Этот сценарий может быть обнаружен путем переопределения onDestroy() в ваших действиях верхнего уровня и проверки isFinished(), чтобы подтвердить, что приложение уничтожается (а не воссоздается действие, например, для изменения ориентации).

0 голосов
/ 14 июля 2010

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

0 голосов
/ 13 июля 2010

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

Я думаю, что Android-способ обработки сценария, подобного вашему, будет управлять состоянием вашего соединения в службе и использовать постоянное хранилище для мониторинга состояния приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...