Android 8.0: java.lang.IllegalStateException: サービスインテントの開始が許可されていません 質問する

Android 8.0: java.lang.IllegalStateException: サービスインテントの開始が許可されていません 質問する

アプリケーションの起動時に、アプリは何らかのネットワーク タスクを実行するサービスを開始します。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);

おすすめ記事