現在Android IntentService
を必要とするプログラムを書いています。onHandleIntent
関数にコードを入れると、コードは実行されませんが、実行されますMainActivity
でエラーが発生することはありませんが、コードをonStartCommand
にコピーすると、完全に実行されます。
問題は、onHandleIntent
とonStartCommand
の違いを知りたいということです。ありがとう。
コード:
onHandleIntent
内:
System.out.println("SERVICE STARTED! ! !");
//System.out.println(intent.getBooleanExtra("once", Boolean.FALSE));
if (intent.getBooleanExtra("once", Boolean.FALSE)) {
Check();
}
mHandler.postDelayed(mRunnable, 3000);
ドキュメント から:
IntentService
は次のことを行います。
- アプリケーションのメインスレッドとは別に
onStartCommand()
に配信されるすべてのインテントを実行するデフォルトのワーカースレッドを作成します。- 一度に1つのインテントを
onHandleIntent()
実装に渡すワークキューを作成するため、マルチスレッドについて心配する必要はありません。- すべての開始要求が処理された後でサービスを停止するため、
stopSelf()
を呼び出す必要はありません。null
を返すonBind()
のデフォルト実装を提供します。- インテントをワークキューに送信してから
onStartCommand()
実装に送信するonHandleIntent()
のデフォルト実装を提供します。
そしてまた:
これらすべてが、クライアントが提供する作業を実行するために
onHandleIntent()
を実装するだけでよいという事実に追加されます。 (ただし、サービスには小さなコンストラクターも提供する必要があります。)
したがって、IntentService
は、これらの特別なプロパティを持つ「カスタム」Service
です。したがって、onStartCommand()
をオーバーライドする必要はありません。実際には、通常のService
クラスを使用している場合を除いて、を実行しないでください。
IntentService
の使用例:
Activity.Java
Intent it = new Intent(getApplicationContext(), YourIntentService.class);
it.putExtra("Key", "Value");
startService(it);
YourIntentService.Java
public YourIntentService() {
super("YourIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
String str = intent.getStringExtra("key");
// Do whatever you need to do here.
}
//...
}
Service
とIntentService
の詳細については、 このチュートリアル または これ を確認することもできます。
また、 ドキュメント も確認してください。
onStartCommand()
は、Service
を使用するときに使用されます。 IntentService
を使用する場合は、代わりにonHandleIntent()
を使用する必要があります。 IntentService
はService
を拡張します。そして、ドキュメントに従って
「IntentServiceに対してこのメソッド(
onStartCommand
)をオーバーライドしないでください。代わりに、IntentServiceが開始リクエストを受け取ったときにシステムが呼び出すonHandleIntent(Intent)
をオーバーライドしてください。」
onStartCommand()
をオーバーライドした場合、onHandleIntent()
が呼び出されないのはそのためかもしれません。
IntentService
のonStartCommand()
をオーバーライドしないでください。
実行する場合は、必ずreturn super.onStartCommand();
を使用してください。これにより、Intent
が作業キューに送信され、次にonHandleIntent()
実装に送信されます。