凄く大事なことなので、載せておきます。
Android8.0対応をした方には凄く悩まされた記事だと思いますが…
中盤辺りに以下のように書かれています。
Android 8.0 では、フォアグラウンドで新しいサービスを開始する
startForegroundService()
メソッドが新たに導入されています。 システムによってサービスが作成されると、アプリは、サービスのstartForeground()
メソッドを 5 秒以内に呼び出して、その新しいサービスの通知をユーザーに表示します。 アプリがstartForeground()
を制限時間内に呼び出さない場合、システムによってサービスが停止され、アプリが ANR になります。
要は、startForegroundService() を呼んで、サービスを起動したときに startForeground() メソッドを 5 秒以内に呼び出さないとクラッシュしてしまいます。
intent = new Intent(context, SampleService.class);
context.startForegroundService(intent);
SampleService.java
@Override
public int onStartCommand(Intent intent, int flags, int startid) {
super.onStartCommand(intent, flags, startid);
boolean hasPermission = false;
// hasPermissionがない場合、クラッシュする
if (hasPermission) {
NotificationCompat.Builder builder = buildNotification(); // 自作の通知作成メソッド
startForeground(NOTIFICATION_ID, builder.build()); // NOTIFICATION_IDは任意の数字
}
}
上記の例だとクラッシュしてしまいます。
startForeground() が必ず呼ばれる仕組みになっているか確認が必要です。
serviceの中身が複雑になってくればくるほど、確認がしづらいのでシンプルな設計を心掛けたいですね。
IDEがこの辺り検知してくれないかな…