アプリケーションの起動時に、アプリは何らかのネットワーク タスクを実行するサービスを開始します。API レベル 26 をターゲットにした後、アプリケーションはバックグラウンドで Android 8.0 のサービスを開始できません。
原因: java.lang.IllegalStateException: サービスの開始は許可されていません インテント { cmp=my.app.tt/com.my.service }: アプリはバックグラウンドにあります uid UidRecord{90372b1 u0a136 CEM アイドル プロセス:1 seq(0,0,0)}
私の理解では、それは次のことに関連しています:バックグラウンド実行の制限
Android 8.0 を対象とするアプリが、バックグラウンド サービスの作成が許可されていない状況で startService() メソッドを使用しようとすると、IllegalStateException がスローされるようになりました。
「許可されていない状況」とは、実際にはどういう意味ですか? また、それを修正する方法を教えてください。サービスを「フォアグラウンド」に設定したくない
ベストアンサー1
解決策が見つかりました。8.0 より前のデバイスの場合は を使用する必要がありますstartService()
が、7.0 以降のデバイスの場合は を使用する必要がありますstartForgroundService()
。サービスを開始するためのコードのサンプルを次に示します。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(new Intent(context, ServedService.class));
} else {
context.startService(new Intent(context, ServedService.class));
}
また、サービス クラスでは、通知用に以下のコードを追加してください。
@Override
public void onCreate() {
super.onCreate();
startForeground(1,new Notification());
}
ここで、O は Android バージョン 26 です。
サービスをフォアグラウンドで実行せず、代わりにバックグラウンドで実行したい場合は、Android O 以降で、以下のようにサービスを接続にバインドする必要があります。
Intent serviceIntent = new Intent(context, ServedService.class);
context.startService(serviceIntent);
context.bindService(serviceIntent, new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//retrieve an instance of the service here from the IBinder returned
//from the onBind method to communicate with
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}, Context.BIND_AUTO_CREATE);