Может ли Android остановить службу, когда приложение находится на переднем плане? - PullRequest
0 голосов
/ 04 декабря 2018

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

Возможно ли, что система останавливаетсяслужба в то время как приложение находится на переднем плане?

Ответы [ 4 ]

0 голосов
/ 05 декабря 2018

Сначала вам нужно знать, когда запускать и останавливать службу.

Создать AppLifeCycleHandler Class

public class AppLifeCycleHandler implements Application.ActivityLifecycleCallbacks, ComponentCallbacks2 {

    private AppLifeCycleCallback appLifeCycleCallback;

    private boolean appInForeground;

    public AppLifeCycleHandler(AppLifeCycleCallback appLifeCycleCallback) {
        this.appLifeCycleCallback = appLifeCycleCallback;
    }

    @Override
    public void onActivityResumed(Activity activity) {
        if (!appInForeground) {
            appInForeground = true;
            appLifeCycleCallback.onAppForeground();
        }
    }

    @Override
    public void onTrimMemory(int i) {
        if (i == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
            appInForeground = false;
            appLifeCycleCallback.onAppBackground();
        }
    }

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

    }

    @Override
    public void onActivityStarted(Activity activity) {

    }

    @Override
    public void onActivityPaused(Activity activity) {

    }

    @Override
    public void onActivityStopped(Activity activity) {

    }

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

    }

    @Override
    public void onActivityDestroyed(Activity activity) {

    }

    @Override
    public void onConfigurationChanged(Configuration configuration) {

    }

    @Override
    public void onLowMemory() {

    }

    interface AppLifeCycleCallback {

        void onAppBackground();

        void onAppForeground();
    }
}

Теперь внутри вашего public class MyApplication extends Application

Добавьтеследующий код implements AppLifeCycleHandler.AppLifeCycleCallback

@Override
    public void onCreate() {
        super.onCreate();

        AppLifeCycleHandler appLifeCycleHandler = new AppLifeCycleHandler(this);
        registerActivityLifecycleCallbacks(appLifeCycleHandler);
        registerComponentCallbacks(appLifeCycleHandler);
}

И наконец:

    @Override
    public void onAppBackground() {
        Log.d("LifecycleEvent", "onAppBackground");
    }

    @Override
    public void onAppForeground() {
        Log.d("LifecycleEvent", "onAppForeground");
    }

Теперь последнее, что вам нужно сделать, это создать службу, перейдите по этой ссылке create-start-stop-android-background-service Поместите ваше начальное и конечное намерения в метод, который мы только что создали внутри класса вашего приложения

0 голосов
/ 04 декабря 2018

Лучшей практикой здесь является использование ForegroundService.Это обычная служба, которая вызывает метод startForeground (), который обеспечивает работу службы.Он широко используется, например, музыкальными плеерами ... так что, как вы понимаете, никому не нравится, когда система убивает музыкальный сервис в середине воспроизведения песни.Это должно сделать.Подробнее Обзор услуг

0 голосов
/ 05 декабря 2018

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

Если бы вы сказали: «... и Служба привязана к Деятельности»Я бы пошел еще дальше: «Служба не будет уничтожена, пока она связана», потому что это будет означать внезапные вызовы onServiceDisconnected(), не вызванные unbindService().

0 голосов
/ 04 декабря 2018

В соответствии с документацией иногда это возможно:

Процесс службы - это процесс, содержащий службу, которая была запущена с помощью метода startService ().Хотя эти процессы не видны непосредственно пользователю, они обычно делают вещи, которые интересуют пользователя (такие как фоновая загрузка или выгрузка сетевых данных), , поэтому система всегда будет поддерживать такие процессы, если не хватает памятичтобы сохранить все основные и видимые процессы. Службы, которые работали в течение длительного времени (например, 30 минут или более), могут быть понижены в значении, чтобы позволить их процессу перейти в список кэшированных LRU, описанный ниже. Это помогает избежать ситуаций, когда очень долго работающие сервисы с утечками памяти или другими проблемами потребляют столько ОЗУ, что мешают системе эффективно использовать кэшированные процессы.

( source )

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