AndroidのIntentService学習

2767 ワード

public abstract class IntentService extends Service
1.IntentServiceの起動と終了
サービスから継承される以上、サービスの開始と終了を考慮します.サービスを開始するには、startService()とbindService()の2つの方法があります.
IntentServiceはstartServiceメソッドで起動すべきであり、理論的にはbindServiceで起動することも可能であり、実際に実行可能かどうかは検証する必要がある.
startServiceメソッドで起動されたサービスは、stopServiceを呼び出して終了するか、サービス自体が自殺するか(stopSelf()を知っています.startServiceメソッドでIntentServiceを起動すると、stopServiceで終了する必要はありません.作業が終了すると自殺します.コードに表示されます.
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); //      , Service         
    }
}

2.InentServiceから継承
抽象クラスとしては、protected abstract void onHandleIntent(Intent intent);
サービスとは異なり、InentServiceが実装されているため、onBindメソッドを実装する必要はありません.
public IBinder onBind(Intent intent) {
    return null;
}
3.新しいスレッドを開く非同期処理の問題
public void onCreate() {
    // TODO: It would be nice to have an option to hold a partial wakelock
    // during processing, and to have a static startService(Context, Intent)
    // method that would launch the service & hand off a wakelock.

    super.onCreate();
    HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
    thread.start();

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

これは、Handlerメカニズムを用いて非同期処理問題を実現する典型的な方法である.新しいServiceHandlerはHandlerから継承され、非同期処理を実現するためには、HandlerThreadを用いて別のスレッドを作成してそのスレッドのLooperをServiceHandlerに渡す必要がある.
4.IntentServiceの役割
public void onStart(Intent intent, int startId) {
    Message msg = mServiceHandler.obtainMessage();
    msg.arg1 = startId;
    msg.obj = intent;
    mServiceHandler.sendMessage(msg);
}

InentServiceを使用すると、バックグラウンドで非同期で問題を処理します.問題情報はすべてIntentにありますが、InentServiceはこのIntentをメッセージにカプセル化し、ServiceHandlerに対応するLooperのメッセージキューに送信し、handleMessageでonHandleIntentにこのタスクを渡して処理し、処理が完了するとInentServiceを終了します.
まとめ:InentServiceはバックグラウンドで私たちの問題を非同期で処理することができますが、Serviceは問題を非同期で処理することはできません(自分で別のスレッドを作成して処理しない限り)、その使用は非常に便利です:やるべきタスク情報をIntentの中に置いて、それからstartServiceが起動してokになって、どのようにこのタスクを完成するかについては、もちろんクラスを書いてInentServiceを継承して、最も重要なのは複写onHandleIntent方法です.
質問:http://blog.csdn.net/zhf198909/article/details/6906786
startService(new Intent(this,MyIntentService.class));  
startService(new Intent(this,MyIntentService.class));
//InentServiceを2回連続で起動すると、アプリケーションがブロックされず、最も重いのは2回目のリクエストが最初のリクエストが終了してから実行されることです(これは、InentServiceがキューから1つのリクエストだけを取り出して処理していることを確認しています)
これについてまだ分からないので、ゆっくり研究します.