[TOC]
1.IntentService的簡單使用
使用IntentService只需自定義類繼承該類,並在建構函式中呼叫super()方法和實現 onHandleIntent()方法即可。
如下程式碼所示:
class MyIntentService:IntentService("MyIntentService") {
override fun onHandleIntent(intent: Intent?) {
//在這裡實現一些業務
LogUtil.i("hugo","onHandleIntent")
Thread.sleep(5000)
}
}
// AndroidManifest 中配置
<application>
<service android:name=".MyIntentService"/>
</application>
//MainActivity
btn_intent_service.setOnClickListener {
startService(Intent(this,MyIntentService::class.java))
}
複製程式碼
這樣就可以了。是不是很簡單,讓我們來看一看IntentService是怎麼實現的吧。
2.IntentService的具體實現
1.在IntentService 的構造方法中需要傳入一個name
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
* @param name Used to name the worker thread, important only for debugging.
*/
public IntentService(String name) {
super();
mName = name;
}
複製程式碼
而這個name 是用於 建立執行緒時給執行緒命名的。
2.在IntentService 首次建立時時系統會呼叫 onCreate() 方法 IntentService在這個方法中會建立一個建立一個了一個執行緒,並啟動了該執行緒 如下:
@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();
//獲取執行緒的looper
mServiceLooper = thread.getLooper();
//建立一個Handler
mServiceHandler = new ServiceHandler(mServiceLooper);
}
複製程式碼
3.在別的元件啟動IntentService時,IntentService會呼叫onStartCommand() 方法
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
複製程式碼
可以看到IntentService 在 onStartCommand() 方法中呼叫了 onStart()方法
@Override
public void onStart(@Nullable Intent intent, int startId) {
//獲取一個Message
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
//把Message傳送給 Handler
mServiceHandler.sendMessage(msg);
}
複製程式碼
這個onStart() 方法主要就是獲取一個Message 並把Intent存入其中 把Message傳送給Handler
3.那我們來看一下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);
}
}
//IntentService.java
protected abstract void onHandleIntent(@Nullable Intent intent);
複製程式碼
可以看到Handler裡面的實現也很簡單,就是把Message中傳過來的Intent傳入 IntentService的抽象方法onHandleIntent() 中,這個方法就是我們實現進行業務操作的方法,然後就是stopSelf() 方法關閉這個Service。
3.總結
看了IntentService的原始碼後發現IntentService主要就是在建立時建立了一個執行緒來進行來進行業務作業。 在呼叫 onStartCommand() 方法時把Intent傳送給Handler,在作業完成後會呼叫 stopSelf() 方法關閉Service。