LoginSignup
18
17

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-10

検証環境

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

  • 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

18
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
17