Edited at

OreoからServiceの扱いが変わって、既存のアプリがピンチに・・・

More than 1 year has passed since last update.


検証環境

この記事の内容は、以下の環境で検証した。


  • Java:open jdk 1.8.0_152

  • Kotlin 1.2.10

  • Android Studio 3.0.2

  • CompileSdkVersion:26


はじめに

Android 8.0であるOreoからバックグラウンド処理に対してかなり厳しいルールが適用されます。

今まで、バックグラウンドで実行していたServiceが既存の実装では止められてしまいます。

この記事ではそんなServiceを救済するための方法を載せます。

何とかして、Serviceを救っていきましょう!


OreoでのServiceの扱いについて

Oreoでは下記のページに書いているように、Serviceを大別します。

バックグラウンド実行制限 | Android Developers

サービスは以下のように区別されます。

Foreground Service(フォアグラウンドサービス)
Background Service(バックグラウンドサービス)

・サービスを起動したアプリのActivityが可視状態にある
・Foreground Serviceを使用している。
・別のアプリが自身のサービスにバインドしている。
・IME、壁紙サービス、通知リスナー、音声またはテキスト サービスにバインドしている。
・バックグラウンドサービスではなくJobSchedulerを使用している。
左記以外すべて

backgroundサービスと判断されると、

アプリがバックグラウンドになってから数分後にはServiceに対し、

stopSelfメソッドを呼び出した時と同じように、Serviceが終了してしまいます。


Serviceを救おう!

既存アプリのServiceを救うには下記の方法があります。


  • アプリを永遠に起動したままにしてもらおう!(現実的ではない)

  • 他のアプリにバインドしてもらおう!(これも現実的ではない)

  • Foreground Serviceにしよう!(現実的だ!)

  • JobSchedulerに置き換えよう!(現実的だ!)

結果的に2つの方法がありそうです。

では、『Foreground Service』と『JobScheduler』の実装方法が理解できれば対応できそうですね。


Foreground Serviceの実装方法

Foreground Serviceの実装方法は下記の記事を参照してください。

Foreground Serviceの基本 - Qiita


JobSchedulerの実装方法

下記の記事を参照してください。

Jobschedulerの基本 - Qiita


JobSchedulerはLolipop(API Level 21)からしか対応していない件

必要に応じてKitkatでも同じことができる下記の2つから選択する必要があります。


まとめ

いずれやってくるOreoに備えて、十分な準備をしておかなければなりません。

この記事では説明しきれていないOreoからの変更もあります。

下記のページで変更内容を確認できますので、是非一度は確認してみてください。

Android 8.0 | Android Developers