Android P: изменение поведения службы

Недавно я возился с новейшей версией Android P, пытаясь запустить простую службу с флагом START_STICKY. В принципе, это моя установка:

MainActivity.java

public class MainActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstance) {
        Intent intent = new Intent(this, MyService.class);
        startService(intent);
    }
}

MyService.java

public class MyService extends Service {
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate()");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy()");
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent);
        Log.d(TAG, "onTaskRemoved()");
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        Log.d(TAG, "onLowMemory()");
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand()");
        return START_STICKY;
    }
}

Конечно, я добавил служебную запись в файл AndroidManifest приложения. Тестирование приложения на моем старом телефоне под управлением Android Nougat, все работает как положено. Вот как выглядит жизненный цикл после запуска приложения:

На Android N

  1. при создании()
  2. onStartCommand ()

Теперь, после удаления приложения из меню недавних:

  1. onTaskRemoved()
  2. при создании()
  3. onStartCommand ()

Это поведение, которое я ожидаю. Но когда я запускаю приложение на своем новом телефоне под управлением Android P DP4, жизненный цикл при запуске приложения выглядит следующим образом:

На Android P

  1. при создании()
  2. onStartCommand ()

Пока ничем не отличается. Но когда я удаляю приложение из недавнего меню:

  1. onTaskRemoved()
  2. при создании()
  3. onDestroy()

Благодаря флагу START_STICKY сервис перезапускается, но мгновенно уничтожается, даже до того, как у него появляется возможность запустить метод onStartCommand.

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

Кто-нибудь сталкивался с подобными проблемами?

Заранее спасибо!


person user2410644    schedule 04.07.2018    source источник
comment
Попробуйте сделать службу приоритетной в onCreate() и посмотрите, поможет ли это. Я предполагаю, что вы видите изменения, которые были введены в Android 8.0 в отношении фоновых служб.   -  person CommonsWare    schedule 04.07.2018


Ответы (1)


Вы ищете в поведенческих изменениях неправильную версию Android. В Android Oreo введены лимиты фонового выполнения, которые ограничивают службы в фоновом режиме. TL;DR: запуск службы в фоновом режиме вызовет IllegalStateException, вместо этого используйте Jobs.

person Sander    schedule 04.07.2018