アプリケーションにService
とBroadcastReceiver
がありますが、BroadcastReceiver
から直接サービスを起動するにはどうすればよいですか?を使用して
startService(new Intent(this, MyService.class));
BroadcastReceiver
では機能しません、アイデアはありますか?
編集:
context.startService(..);
動作します、コンテキスト部分を忘れました
忘れないで
context.startService(..);
そのようにする必要があります:
Intent i = new Intent(context, YourServiceName.class);
context.startService(i);
必ずmanifest.xmlにサービスを追加してください
BroadcastReceiver のcontext
メソッドのonReceive
を使用して、サービスコンポーネントを開始します。
@Override
public void onReceive(Context context, Intent intent) {
Intent serviceIntent = new Intent(context, YourService.class);
context.startService(serviceIntent);
}
ベストプラクティス:
特にBroadcastReceiver
から開始するときにインテントを作成するときは、コンテキストとしてthisを使用しないでください。 context.getApplicationContext()
を以下のように取ります
Intent intent = new Intent(context.getApplicationContext(), classNAME);
context.getApplicationContext().startService(intent);
try {
Intent intentService = new Intent(context, MyNewIntentService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(intentService );
} else {
context.startService(intentService );
}
} catch (Exception e) {
e.printStackTrace();
}
レシーバーのonReceive(Context、Intent)メソッドはメインスレッドで実行されるため、実行してすぐに戻る必要があります。長時間実行する作業を実行する必要がある場合は、onReceive()が戻った後にシステムがプロセス全体を強制終了できるため、スレッドの生成またはバックグラウンドサービスの開始に注意してください。詳細については、プロセス状態への影響を参照してください。長時間実行される作業を実行するには、以下をお勧めします。
レシーバーのonReceive()メソッドでgoAsync()を呼び出し、BroadcastReceiver.PendingResultをバックグラウンドスレッドに渡します。これにより、onReceive()から戻った後もブロードキャストがアクティブになります。ただし、このアプローチを使用しても、システムは非常に迅速に(10秒未満)ブロードキャストを終了することを期待しています。メインスレッドのグリッチを回避するために、作業を別のスレッドに移動できます。 JobSchedulerを使用したジョブのスケジューリング developer.Android.com