検証環境
この記事の内容は、以下の環境で検証した。
- 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つから選択する必要があります。
- GCMNetworkManager
GcmNetworkManager | Google APIs for Android | Google Developers - Firebase JobDispatcher
https://github.com/firebase/firebase-jobdispatcher-android
まとめ
いずれやってくるOreoに備えて、十分な準備をしておかなければなりません。
この記事では説明しきれていないOreoからの変更もあります。
下記のページで変更内容を確認できますので、是非一度は確認してみてください。