サービス(IntentService)を開始すると、サービス関数であるonHandleIntent()が呼び出されます。実行中にstartService()を再度呼び出すと、invokeがキャッシュされ、onHandleIntent()が再度呼び出されます。実際に私がやりたいのは、追加を作成せずに、現在実行中のサービスインスタンスにいくつかの新しいデータを渡すことです。(スレッドまたはリスナーでのシグナリングのように)。どうすればいいのですか?onHandleIntent()で使用したいwhile(true){....}
ので、永久に実行されます。
2 に答える
通常のServiceクラスを拡張します。受け取った最初のonStartCommand()で、「while(true){...}」コードを持つバックグラウンドスレッドを開始します。その後のonStartCommand()呼び出しで、ワーカースレッドの存在を確認し、存在する場合はシグナルを送信します。
あなたがこのサービスを何に使うのかを知らなければ、あなたにもっと良いアドバイスを与えるのは難しいです。ただし、考慮すべき点がいくつかあります。-IntentServiceでも使用されるLooper / Handlerクラスを確認してください。これらは、シグナリングを含む「while(true)」ループをコーディングするための優れた方法を提供する場合があります。--onStartCommand()メソッドは数秒以内に戻る必要があることを忘れないでください(メインスレッドで実行されています)。したがって、新しい作業(onStartCommandで渡されたインテントを介して受信)を渡す場合は、このハンドを確認する必要があります-オフはそれほど長くはかかりません。Looper/Handlerクラスはここでも役立つ場合があります。
サービスがすでに開始されているかどうかを確認します。開始されていない場合は、次のようにします。
private boolean isMyServiceRunning() {
ActivityManager manager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if ("com.example.Service".equals(service.service.getClassName())) {
return true;
}
}
return false;
}