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

検証環境

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

  • 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

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.