intentservice start android example




IntentServiceを無期限に実行できますか? (3)

IntentServiceは実際にはハンドラをラップするIntentService小さなクラスですstopSelf()が処理された後にstopSelf()stopSelf()れるという問題があります。

その1行を削除すると、明示的に停止する必要のあるIntentServiceが得られます。

public abstract class NonStopIntentService extends Service {

    private String mName;
    private volatile Looper mServiceLooper;
    private volatile ServiceHandler mServiceHandler;

    public NonStopIntentService(String name) {
        super();
        mName = name;
    }

    private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            onHandleIntent((Intent)msg.obj);
            // stopSelf(msg.arg1); <-- Removed
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

    @Override
    public void onStart(Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        onStart(intent, startId);
        return START_STICKY;
    }    

    @Override
    public void onDestroy() {
        mServiceLooper.quit();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    /**
     * This method is invoked on the worker thread with a request to process.
     * Only one Intent is processed at a time, but the processing happens on a
     * worker thread that runs independently from other application logic.
     * So, if this code takes a long time, it will hold up other requests to
     * the same IntentService, but it will not hold up anything else.
     *
     * @param intent The value passed to {@link
     *               android.content.Context#startService(Intent)}.
     */
    protected abstract void onHandleIntent(Intent intent);  

}

https://code.i-harness.com

私の理解に基づいて、IntentServiceは現在の要求が完了した時点で停止します。

以下のシナリオを考えてみましょう。私は100msごとにIntentSerivceへのリクエストをトリガし、そのリクエストの処理時間は90msになります。

つまり、startSerivceの呼び出しごとに、サービスが呼び出され、90ms後に(処理が完了すると)IntentServiceのonDestroyが呼び出されます。

私は、このIntentServiceeが停止するまで実行したいと思います。 それは可能ですか?

私は私のサービスで以下を行うつもりであると仮定します

  1. 設定する
  2. リクエストを送信する
  3. 応答を待つ
  4. 応答を読む
  5. 呼び出されたアクティビティにブロードキャストする

手順1はすべての私の要求に共通しているので、サービスが最初に1回起動されたときにそれらを実行できると思って、要求に基づいてHandleIntentを3-6回実行します。


IntentServiceは標準のServiceクラスから拡張されているので、なぜこのようにしてはならないのか分かりません。 実際に私はこのようにもやっていきます。 ;)


サービスを停止しないようにするには、 Serviceを作成してServicebind必要があります。 docs参照してください。

bindService()開始されるサービスは、まだアクティビティがバインドされていないbindService()実行されます。





intentservice