web-dev-qa-db-ja.com

BroadcastReceiverからサービスを開始する

アプリケーションにServiceBroadcastReceiverがありますが、BroadcastReceiverから直接サービスを起動するにはどうすればよいですか?を使用して

startService(new Intent(this, MyService.class));

BroadcastReceiverでは機能しません、アイデアはありますか?

編集:

context.startService(..);

動作します、コンテキスト部分を忘れました

62
Samuel

忘れないで

context.startService(..);

100
Samuel

そのようにする必要があります:

Intent i = new Intent(context, YourServiceName.class);
context.startService(i);

必ずmanifest.xmlにサービスを追加してください

55
Zeev G

BroadcastReceivercontextメソッドのonReceiveを使用して、サービスコンポーネントを開始します。

@Override
public void onReceive(Context context, Intent intent) {
      Intent serviceIntent = new Intent(context, YourService.class);
      context.startService(serviceIntent);
}
8
Sachin K

ベストプラクティス:

特にBroadcastReceiverから開始するときにインテントを作成するときは、コンテキストとしてthisを使用しないでください。 context.getApplicationContext()を以下のように取ります

 Intent intent = new Intent(context.getApplicationContext(), classNAME);
context.getApplicationContext().startService(intent);
5
ARUN
 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();
    }
1
Peter

レシーバーのonReceive(Context、Intent)メソッドはメインスレッドで実行されるため、実行してすぐに戻る必要があります。長時間実行する作業を実行する必要がある場合は、onReceive()が戻った後にシステムがプロセス全体を強制終了できるため、スレッドの生成またはバックグラウンドサービスの開始に注意してください。詳細については、プロセス状態への影響を参照してください。長時間実行される作業を実行するには、以下をお勧めします。

レシーバーのonReceive()メソッドでgoAsync()を呼び出し、BroadcastReceiver.PendingResultをバックグラウンドスレッドに渡します。これにより、onReceive()から戻った後もブロードキャストがアクティブになります。ただし、このアプローチを使用しても、システムは非常に迅速に(10秒未満)ブロードキャストを終了することを期待しています。メインスレッドのグリッチを回避するために、作業を別のスレッドに移動できます。 JobSchedulerを使用したジョブのスケジューリング developer.Android.com

0
Hojjat Zohoori