2016-01-07 5 views
7

私は現在IntentServiceが必要なアンドロイドプログラムを作成しています。コードをonHandleIntent関数に入れても、コードは実行されませんが、MainActivityにエラーはありません。しかし、コードをonStartCommandにコピーすると、完全に動作します。Android onHandleIntentとonStartCommandの違い

onHandleIntentonStartCommandの違いは何ですか?ありがとう。

CODE:onHandleIntent

the docsからも

System.out.println("SERVICE STARTED! ! !"); 
//System.out.println(intent.getBooleanExtra("once", Boolean.FALSE)); 
if (intent.getBooleanExtra("once", Boolean.FALSE)) { 
    Check(); 
} 
mHandler.postDelayed(mRunnable, 3000); 

答えて

21

IntentServiceは以下のん:

  • は、すべての実行デフォルトのワーカースレッドを作成します。インテントは、アプリケーションのメインスレッドとは別のonStartCommand()に配信されます。
  • 一度に1つのインテントをonHandleIntent()実装に渡す作業キューを作成するので、マルチスレッドの を心配する必要はありません。
  • すべての開始要求が処理された後にサービスを停止するので、stopSelf()に電話する必要はありません。
  • nullを返すonBind()の既定の実装を提供します。
  • インテントを作業キューに送信し、次にonHandleIntent() 実装に送信する、デフォルトの実装onStartCommand()を提供します。

も:

このすべてはあなたがする必要があるすべては、クライアントが提供する仕事をする 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についての詳細はthis tutorialまたはthis oneを確認することができます。

また、the docsにチェックしてください。

+2

うわー、これは信じられないほど徹底的でした。いい答え! – AdamMc331

+0

私はチュートリアルを終えました、彼らは素晴らしいです!しかし、私は 'onStartCommand'や' onHandleIntent'を '@ overide'していないという問題がありますか? – Chromium

+0

あなたはあなたが 'onStartCommand'をオーバーライドしたことを質問したので、' IntentService'でそれを行うべきではありません。代わりに 'onHandleIntent'を使うと、自動的に呼び出されます。 – Mauker

3

onStartCommandは、Serviceを使用する場合に使用されます。 IntentServiceを使用する場合は、代わりにonHandleIntentを使用してください。 IntentServiceServiceです。そして、ドキュメント

ごとに「あなたは IntentServiceのために、この方法(onStartCommand)をオーバーライドしてはならない。その代わり、IntentServiceが開始要求を受信したとき システムコールをonHandleIntent(Intent)を、上書きします。」

onStartCommandを上書きすると、onHandleIntentが呼び出されないことがあります。

+1

'IntentService 'を使用しているときに' onStartCommand() 'をオーバーライドすれば、後で' onHandleIntent() 'を呼び出すことはできません** ** onStartCommand()の最後の行が** 'super.OnStartCommand(intent、flags、startId)を返します。 – GeertVc

1

IntentServiceにはonStartCommand()を上書きしないでください。

これを行う場合は、インテントを作業キューに送信してからonHandleIntent()実装に送信するため、必ずreturn super.onStartCommand();にしてください。

関連する問題