Как узнать, уничтожена ли моя деятельность на службе? - PullRequest
1 голос
/ 11 июня 2019

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

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

Код, который выполняется при нажатии кнопки закрытия в уведомлении:

mMediaSessionCompat.setCallback(new MediaSessionCompat.Callback() {
        @Override
        public void onStop() {
            super.onStop();
            Main.unbindService(getApplicationContext());
            stopSelf();
            Log.d(TAG,"stop!");
}

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

Итак, мой вопрос: как я могу определить, когда мое приложение все еще работает (видимое для пользователя или в фоновом режиме (недавние приложения) и когда оно уничтожается и присутствует только уведомление?

Итак, я могу создавать операторы if для вызова stopSelf(); только тогда, когда приложение уничтожено, и не вызывать его, когда мое приложение все еще работает.

1 Ответ

0 голосов
/ 12 июня 2019

Возможно, метод Application.registerActivityLifecycleCallbacks() может быть вам полезен.Вы можете поместить что-то вроде этого в метод onCreate() вашего приложения:

registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
        int activityCount = 0;

        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            activityCount++;
        }

        @Override
        public void onActivityStarted(Activity activity) {}

        @Override
        public void onActivityResumed(Activity activity) {}

        @Override
        public void onActivityPaused(Activity activity) {}

        @Override
        public void onActivityStopped(Activity activity) {}

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

        @Override
        public void onActivityDestroyed(Activity activity) {
            activityCount--;
        }
    });

и использовать его для отслеживания того, выполняется ли какое-либо из ваших действий.

EDIT : Хорошо, если вы хотите избежать ситуации, когда законченное действие продолжает зависать в течение некоторого времени перед вызовом метода onDestroyed(), вы можете использовать более продвинутый подход, где вы проверяете, заканчивается ли действие в onActivityPaused и onActivityStopped.Итак, вы создаете класс, подобный этому:

private class ActivityWatcher implements Application.ActivityLifecycleCallbacks {

    //a set of currently running activities
    private Set<Activity> activities = new HashSet<>();

    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        activities.add(activity);
    }

    @Override
    public void onActivityStarted(Activity activity) {}

    @Override
    public void onActivityResumed(Activity activity) {}

    @Override
    public void onActivityPaused(Activity activity) {
        if (activity.isFinishing()) {
            activities.remove(activity);
        }
    }

    @Override
    public void onActivityStopped(Activity activity) {
        if (activity.isFinishing()) {
            activities.remove(activity);
        }
    }

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

    @Override
    public void onActivityDestroyed(Activity activity) {
        activities.remove(activity);
    }

    public boolean isAnyActivityRunning() {
        return !activities.isEmpty();
    }
}

, а затем в своем классе приложения вы создаете экземпляр и регистрируете его как обратный вызов жизненного цикла действия:

public class MyApplication extends Application {

    private ActivityWatcher activityWatcher = new ActivityWatcher();

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(activityWatcher);
    }

    public boolean isAppAlive() {
        return activityWatcher.isAnyActivityRunning();
    }
}

Должно работать.

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