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

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

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

Ответы [ 22 ]

2 голосов
/ 26 октября 2018
if(!activity.isFinishing() && !activity.isDestroyed())
2 голосов
/ 20 марта 2018

а как же activity.isFinishing()

2 голосов
/ 12 февраля 2018

ActivityLifecycleCallbacks - отличный способ отслеживать все действия в приложении:

public class BaseActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks {

private ActivityState homeState, contentState;

@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.CREATED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.CREATED;
    }
}

@Override
public void onActivityStarted(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.STARTED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.STARTED;
    }
}

@Override
public void onActivityResumed(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.RESUMED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.RESUMED;
    }
}

@Override
public void onActivityPaused(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.PAUSED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.PAUSED;
    }
}

@Override
public void onActivityStopped(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.STOPPED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.STOPPED;
    }
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}

@Override
public void onActivityDestroyed(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.DESTROYED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.DESTROYED;
    }
}

public ActivityState getHomeState() {
    return homeState;
}

public ActivityState getContentState() {
    return contentState;
}
}

ActivityState:

public enum ActivityState {
    CREATED, STARTED, RESUMED, PAUSED, STOPPED, DESTROYED;
}

Расширьте класс Application и укажите его ссылку в файле манифеста Android:

import android.app.Application;

public final class BaseApplication extends Application {
private BaseActivityLifecycleCallbacks baseALC;

@Override
public void onCreate() {
    super.onCreate();
    baseALC = new BaseActivityLifecycleCallbacks();
    this.registerActivityLifecycleCallbacks(baseALC);

}

public BaseActivityLifecycleCallbacks getBaseALC() {
    return baseALC;
}
}

Нажмите где-нибудь из Activity для статуса другой активности:

private void checkAndLaunchHomeScreen() {
    Application application = getApplication();
    if (application instanceof BaseApplication) {
        BaseApplication baseApplication = (BaseApplication) application;
        if (baseApplication.getBaseALC().getHomeState() == null || baseApplication.getBaseALC().getHomeState() == ActivityState.DESTROYED) {
            //Do anything you want
        }
    }
}

https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html

2 голосов
/ 04 апреля 2016

Я использовал чек if (!a.isFinishing()), и он, кажется, делает то, что мне нужно.a - это экземпляр действия.Это неверно?Почему никто не попробовал это?

1 голос
/ 13 апреля 2015

В дополнение к принятому ответу , если у вас есть несколько экземпляров действия, вместо него можно использовать счетчик:

class MyActivity extends Activity {

     static int activeInstances = 0;

     static boolean isActive() {
        return (activeInstance > 0)
     }

      @Override
      public void onStart() {
         super.onStart();
         activeInstances++;
      } 

      @Override
      public void onStop() {
         super.onStop();
         activeInstances--;
      }
}
1 голос
/ 05 февраля 2019

Вы пробовали ..

    if (getActivity() instanceof NameOfYourActivity){
        //Do something
    }
1 голос
/ 16 октября 2013

Не уверен, что это «правильный» способ «делать вещи».
Если для решения (или а) вопроса нет способа API, чем вы должны немного подумать, возможно, вы делаете что-то не так и вместо этого читаете больше документов и т. Д.
(Как я понял, статические переменные обычно не подходят для Android. Конечно, это может сработать, но определенно будут случаи, когда они не будут работать [например, на производстве, на миллионах устройств]).
Именно в вашем случае я предлагаю подумать , почему вам нужно знать, живо ли другое действие? .. Вы можете запустить другое действие для результата, чтобы получить его функциональность. Или вы можете получить класс, чтобы получить его функциональность и т. Д.
С наилучшими пожеланиями.

1 голос
/ 20 августа 2014

Используйте заказанную трансляцию.См. http://android -developers.blogspot.nl / 2011/01 / processing-orders-broadcasts.html

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

1 голос
/ 22 апреля 2014

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

0 голосов
/ 07 ноября 2018

Используйте переменную isActivity, чтобы проверить, активна ли активность или нет.

private boolean activityState = true;

 @Override
protected void onDestroy() {
    super.onDestroy();
    activityState = false;
}

Тогда отметьте

if(activityState){
//add your code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...