Android P: изменение поведения сервиса - PullRequest
0 голосов
/ 04 июля 2018

Недавно я возился с новейшей версией 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. OnCreate ()
  2. onStartCommand ()

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

  1. onTaskRemoved ()
  2. OnCreate ()
  3. onStartCommand ()

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

На Android P

  1. OnCreate ()
  2. onStartCommand ()

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

  1. onTaskRemoved ()
  2. OnCreate () * * тысяча пятьдесят-одна
  3. OnDestroy ()

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

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

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

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

1 Ответ

0 голосов
/ 04 июля 2018

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

...