1

サービス(IntentService)を開始すると、サービス関数であるonHandleIntent()が呼び出されます。実行中にstartService()を再度呼び出すと、invokeがキャッシュされ、onHandleIntent()が再度呼び出されます。実際に私がやりたいのは、追加を作成せずに、現在実行中のサービスインスタンスにいくつかの新しいデータを渡すことです。(スレッドまたはリスナーでのシグナリングのように)。どうすればいいのですか?onHandleIntent()で使用したいwhile(true){....}ので、永久に実行されます。

4

2 に答える 2

1

通常のServiceクラスを拡張します。受け取った最初のonStartCommand()で、「while(true){...}」コードを持つバックグラウンドスレッドを開始します。その後のonStartCommand()呼び出しで、ワーカースレッドの存在を確認し、存在する場合はシグナルを送信します。

あなたがこのサービスを何に使うのかを知らなければ、あなたにもっと良いアドバイスを与えるのは難しいです。ただし、考慮すべき点がいくつかあります。-IntentServiceでも使用されるLooper / Handlerクラスを確認してください。これらは、シグナリングを含む「while(true)」ループをコーディングするための優れた方法を提供する場合があります。--onStartCommand()メソッドは数秒以内に戻る必要があることを忘れないでください(メインスレッドで実行されています)。したがって、新しい作業(onStartCommandで渡されたインテントを介して受信)を渡す場合は、このハンドを確認する必要があります-オフはそれほど長くはかかりません。Looper/Handlerクラスはここでも役立つ場合があります。

于 2013-02-04T15:26:52.790 に答える
1

サービスがすでに開始されているかどうかを確認します。開始されていない場合は、次のようにします。

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;
}
于 2015-09-15T12:01:07.733 に答える