Android: как проверить, работает ли активность? - PullRequest
129 голосов
/ 27 марта 2011

Есть ли простой способ определить, активна ли определенная деятельность? Я хочу делать определенные вещи в зависимости от того, какая деятельность активна. например:

if(activityrunning == activity1)
//do this
else if (activityrunning == activity2)
//do something else

Ответы [ 22 ]

212 голосов
/ 27 марта 2011

Вы можете использовать переменную static в действии.

class MyActivity extends Activity {
     static boolean active = false;

      @Override
      public void onStart() {
         super.onStart();
         active = true;
      } 

      @Override
      public void onStop() {
         super.onStop();
         active = false;
      }
}

Единственный недостаток заключается в том, что если вы используете его в двух действиях, которые связаны друг с другом, то onStop на первом иногдавызывается после onStart в секунду.Таким образом, оба могут быть верны вкратце.

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

39 голосов
/ 31 мая 2012

Я думаю, что более ясно, как это:

  public boolean isRunning(Context ctx) {
        ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);

        for (RunningTaskInfo task : tasks) {
            if (ctx.getPackageName().equalsIgnoreCase(task.baseActivity.getPackageName())) 
                return true;                                  
        }

        return false;
    }
23 голосов
/ 02 июля 2014

Гораздо лучший способ, чем использование статической переменной и последующее ООП

Shared Preferences можно использовать для обмена переменными с другими activities и службами из одного application

    public class example extends Activity {

    @Override
    protected void onStart() {
        super.onStart();

        // Store our shared preference
        SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE);
        Editor ed = sp.edit();
        ed.putBoolean("active", true);
        ed.commit();
    }

    @Override
    protected void onStop() {
        super.onStop();

        // Store our shared preference
        SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE);
        Editor ed = sp.edit();
        ed.putBoolean("active", false);
        ed.commit();

    }
}

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

22 голосов
/ 08 сентября 2014

Опция без использования вспомогательной переменной:

activity.getWindow().getDecorView().getRootView().isShown()

, где активность - это f.e .: this или getActivity ().

Значение, возвращаемое этим выражением, изменяется в onStart () / onStop (), которые представляют собой события, которые запускаются / останавливаются, показывая макет действия на телефоне.

21 голосов
/ 17 сентября 2013

Я использовал MyActivity.class и метод getCanonicalName и получил ответ.

protected Boolean isActivityRunning(Class activityClass)
{
        ActivityManager activityManager = (ActivityManager) getBaseContext().getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);

        for (ActivityManager.RunningTaskInfo task : tasks) {
            if (activityClass.getCanonicalName().equalsIgnoreCase(task.baseActivity.getClassName()))
                return true;
        }

        return false;
}
9 голосов
/ 27 марта 2011

Это код для проверки того, запущена ли конкретная служба.Я вполне уверен, что это может работать и для деятельности, если вы меняете getRunningServices с помощью getRunningAppProcesses () или getRunningTasks ().Посмотрите здесь http://developer.android.com/reference/android/app/ActivityManager.html#getRunningAppProcesses()

Изменение констант.PACKAGE и Constants.BACKGROUND_SERVICE_CLASS соответственно

    public static boolean isServiceRunning(Context context) {

    Log.i(TAG, "Checking if service is running");

    ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);

    List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);

    boolean isServiceFound = false;

    for (int i = 0; i < services.size(); i++) {

        if (Constants.PACKAGE.equals(services.get(i).service.getPackageName())){

            if (Constants.BACKGROUND_SERVICE_CLASS.equals(services.get(i).service.getClassName())){
                isServiceFound = true;
            }
        }
    }

    Log.i(TAG, "Service was" + (isServiceFound ? "" : " not") + " running");

    return isServiceFound;

}
6 голосов
/ 05 декабря 2011

спасибо, ккуди!Я смог адаптировать ваш ответ к работе для действия ... вот что сработало в моем приложении ..

public boolean isServiceRunning() { 

ActivityManager activityManager = (ActivityManager)Monitor.this.getSystemService (Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE); 
    isServiceFound = false; 
    for (int i = 0; i < services.size(); i++) { 
        if (services.get(i).topActivity.toString().equalsIgnoreCase("ComponentInfo{com.lyo.AutoMessage/com.lyo.AutoMessage.TextLogList}")) {
            isServiceFound = true;
        }
    } 
    return isServiceFound; 
} 

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

<uses-permission  android:name="android.permission.GET_TASKS"/>

Надеюсь, это было полезно!

4 голосов
/ 15 апреля 2019

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

Это решение не было доступно до выпуска компонентов архитектуры Android.

Активность по крайней мере частично видна

getLifecycle().getCurrentState().isAtLeast(STARTED)

Активность на переднем плане

getLifecycle().getCurrentState().isAtLeast(RESUMED)
4 голосов
/ 21 декабря 2016

Я думаю, что принятый ответ - ужасный способ справиться с этим.

Я не знаю, каков вариант использования, но рассмотрите защищенный метод в базовом классе

@protected
void doSomething() {
}

и переопределить его в производном классе.

Когда событие происходит, просто вызовите этот метод в базовом классе. Правильный «активный» класс будет обрабатывать это тогда. Затем сам класс может проверить, не является ли он Paused().

Еще лучше, использовать шину событий, такую ​​как GreenRobot , Square * , но она не рекомендуется и предлагает использовать RxJava

3 голосов
/ 16 января 2013

Существует намного более простой способ, чем все вышеперечисленное, и этот подход не требует использования android.permission.GET_TASKS в манифесте, или не указывает на проблему состояний гонки или утечек памяти в принятом ответе.

  1. Создайте переменную STATIC в основной операции. Статический позволяет другим действиям получать данные от другого действия. onPause() установить эту переменную false , onResume и onCreate() установить эту переменную true .

    private static boolean mainActivityIsOpen;
    
  2. Назначьте методы получения и установки этой переменной.

    public static boolean mainActivityIsOpen() {
        return mainActivityIsOpen;
    }
    
    public static void mainActivityIsOpen(boolean mainActivityIsOpen) {
        DayView.mainActivityIsOpen = mainActivityIsOpen;
    }
    
  3. А потом из другой деятельности или Службы

    if (MainActivity.mainActivityIsOpen() == false)
    {
                    //do something
    }
    else if(MainActivity.mainActivityIsOpen() == true)
    {//or just else. . . ( or else if, does't matter)
            //do something
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...