Android ServiceとIntentServiceの違い
4691 ワード
サービスはIntentServiceの親です
サービスはバックグラウンドサービスであり、アプリケーションと同じスレッドにあり、
IntentServiceはツールクラスに相当し、重複するコードをカプセル化してくれます.
以前、私たちがサービスを書いたように、復唱する方法は、onCreate()、onStart()、onBind()、onStartCommand()などです.
これらはInentServiceですでに作成されています
抽象メソッドonHandlerIntent()メソッドを複写すればよいので,このメソッドではintentパラメータなどを受信する.
次に、ソースコードと組み合わせてInentServiceの分析を行います.
Looper:現在のスレッドを取得する
ServerHandler:メッセージの処理
次は、Server Handlerを参照してください.
次にIntentServiceのonCreate()メソッドを見てみましょう.
最後に、onStart()メソッドを見てみましょう.
このIntentServiceと継承サービスコードは簡潔で、かつ別のスレッドであり、主スレッドがブロックされることはありません.特に時間のかかる操作のように、
だから早くサービスを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に変えましょう.