Slide 1

Slide 1 text

Android 8.0のPush受信時の サービス起動について 2018/11/15 - potatotips #56 Hideo Ohashi 1

Slide 2

Slide 2 text

About Me ● Androidエンジニア8年間やってます ● 現在はスマートニュース株式会社でAndroidアプ リ開発全般に関わっています 2

Slide 3

Slide 3 text

Today’s topic ● Android 8.0対応時に発生した、Push受信時の バックグラウンドサービス起動の問題と、そこか ら学んだことの共有させていただきたいと思いま す 3

Slide 4

Slide 4 text

バックグラウンドサービスの制限 ● Android 8.0からバックグラウンドサービスの実 行に制限がつきました ○ https://developer.android.com/about/versions/oreo/background ● ただし特定の状況のときは実行制限はなくなり、 優先度高のPush受信もそのうちのひとつです 4

Slide 5

Slide 5 text

状況 ● SmartNewsではPushを受けた後に処理を Serviceに委譲し、別途画像を取得して Notificationを出していました ● Android8.0でもそのままで動作するはずが、 startService()の呼び出しで IllegalStateExceptionが発生していました 5

Slide 6

Slide 6 text

なぜだろうか? 6

Slide 7

Slide 7 text

原因(たぶん) ● 試しに優先度高のPushを受けてから60秒ほど 経った後にstartService()を呼び出したら IllegalStateExceptionが発生しました ● onReceive()では基本的にstartService()を呼び 出しているだけなので、Pushを受けてからアプリ のonReceive()が呼ばれるまでの、アプリ側から 手が出せないところで時間がかかってしまってい る可能性が高い 7

Slide 8

Slide 8 text

どう解決したか ● Serviceを使っていた理由は主に画像ダウン ロードだったので、startService()に失敗した場 合は画像なしでNotificationを出すことで解決さ せました ○ 多少の情報は落ちてもリアルタイムに表示することを優 先させました 8

Slide 9

Slide 9 text

まとめ ● 何かPushを受けてバックグラウンドサービスを 動かしたいとき、優先度高のPushでも startService()が失敗する場合があることを考え て設計・実装したほうがよさそう 9

Slide 10

Slide 10 text

ご静聴ありがとうございました 10