web-dev-qa-db-ja.com

Android onHandleIntentとonStartCommandの違い

現在Android IntentServiceを必要とするプログラムを書いています。onHandleIntent関数にコードを入れると、コードは実行されませんが、実行されますMainActivityでエラーが発生することはありませんが、コードをonStartCommandにコピーすると、完全に実行されます。

問題は、onHandleIntentonStartCommandの違いを知りたいということです。ありがとう。

コード:

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);
13
Chromium

ドキュメント から:

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.
    }
    //...
}

ServiceIntentServiceの詳細については、 このチュートリアル または これ を確認することもできます。

また、 ドキュメント も確認してください。

37
Mauker

onStartCommand()は、Serviceを使用するときに使用されます。 IntentServiceを使用する場合は、代わりにonHandleIntent()を使用する必要があります。 IntentServiceServiceを拡張します。そして、ドキュメントに従って

「IntentServiceに対してこのメ​​ソッド(onStartCommand)をオーバーライドしないでください。代わりに、IntentServiceが開始リクエストを受け取ったときにシステムが呼び出すonHandleIntent(Intent)をオーバーライドしてください。」

onStartCommand()をオーバーライドした場合、onHandleIntent()が呼び出されないのはそのためかもしれません。

4
Roshan

IntentServiceonStartCommand()をオーバーライドしないでください。

実行する場合は、必ずreturn super.onStartCommand();を使用してください。これにより、Intentが作業キューに送信され、次にonHandleIntent()実装に送信されます。

2
activedecay