Android ServiceとIntentServiceの違い

4691 ワード

サービスはIntentServiceの親です
サービスはバックグラウンドサービスであり、アプリケーションと同じスレッドにあり、
IntentServiceはツールクラスに相当し、重複するコードをカプセル化してくれます.
以前、私たちがサービスを書いたように、復唱する方法は、onCreate()、onStart()、onBind()、onStartCommand()などです.
これらはInentServiceですでに作成されています
抽象メソッドonHandlerIntent()メソッドを複写すればよいので,このメソッドではintentパラメータなどを受信する.
次に、ソースコードと組み合わせてInentServiceの分析を行います.
public abstract class IntentService extends Service {
    private volatile Looper mServiceLooper;
    private volatile ServiceHandler mServiceHandler;
    private String mName;
    private boolean mRedelivery;
InentServiceの基本ドメインは上記です.
Looper:現在のスレッドを取得する
ServerHandler:メッセージの処理
次は、Server Handlerを参照してください.
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);
    }
}
メッセージを処理するとき、サブクラスのonHandleIntent(Intent intent)メソッドをコールバックし、終了してから現在のスレッドを終了します.
次にIntentServiceのonCreate()メソッドを見てみましょう.
@Override
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);
}
驚いたことに、それは自分でスレッドHandlerThreadを開いてIntentを処理し、ServiceHandlerオブジェクトをインスタンス化しました.
最後に、onStart()メソッドを見てみましょう.
@Override
public void onStart(Intent intent, int startId) {
    Message msg = mServiceHandler.obtainMessage();
    msg.arg1 = startId;
    msg.obj = intent;
    mServiceHandler.sendMessage(msg);
}
handlerでメッセージを送信し、
このIntentServiceと継承サービスコードは簡潔で、かつ別のスレッドであり、主スレッドがブロックされることはありません.特に時間のかかる操作のように、
だから早くサービスをIntentServiceに変えましょう.