IntentService是繼承并處理異步請求的一個(gè)類楼熄,在IntentService內(nèi)有一個(gè)工作線程來處理耗時(shí)操作,啟動IntentService的方式和啟動傳統(tǒng)的Service一樣,同時(shí)夹孔,當(dāng)任務(wù)執(zhí)行完后办陷,IntentService會自動停止,而不需要我們手動去控制或stopSelf()炸枣。另外虏等,可以啟動IntentService多次,而每一個(gè)耗時(shí)操作會以工作隊(duì)列的方式在IntentService的onHandleIntent回調(diào)方法中執(zhí)行适肠,并且霍衫,每次只會執(zhí)行一個(gè)工作線程,執(zhí)行完第一個(gè)再執(zhí)行第二個(gè)侯养,以此類推敦跌。
先來看一下IntentService類的源碼:
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(); //開啟一個(gè)工作線程
mServiceLooper = thread.getLooper(); //單獨(dú)的消息隊(duì)列
mServiceHandler = new ServiceHandler(mServiceLooper);
}
定義一個(gè)IntentService的子類:
public class MIntentService extends IntentService {
public MIntentService(){
super("MIntentService");
}
/**
* Creates an IntentService. Invoked by your subclass's constructor.
* @param name Used to name the worker thread, important only for debugging.
*/
public MIntentService(String name) {
super(name);
}
@Override
public void onCreate() {
Log.e("MIntentService--", "onCreate");
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("MIntentService--", "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
protected void onHandleIntent(Intent intent) {
Log.e("MIntentService--", Thread.currentThread().getName() + "--" + intent.getStringExtra("info") );
for(int i = 0; i < 100; i++){ //耗時(shí)操作
Log.i("onHandleIntent--", i + "--" + Thread.currentThread().getName());
}
}
@Override
public void onDestroy() {
Log.e("MIntentService--", "onDestroy");
super.onDestroy();
}
}
開啟IntentService服務(wù):
public void intentClick(View v){
Intent intent = new Intent(this, MIntentService.class);
intent.putExtra("info", "good good study");
startService(intent);
}
點(diǎn)擊按鈕之后輸出結(jié)果為(過濾log.e):
10-25 16:54:58.852 27135-27135/com.example.lenovo.myintentservicedemo E/MIntentService--﹕ onCreate
10-25 16:54:58.852 27135-27135/com.example.lenovo.myintentservicedemo E/MIntentService--﹕ onStartCommand
10-25 16:54:58.856 27135-27354/com.example.lenovo.myintentservicedemo E/MIntentService--﹕ IntentService[MIntentService]--good good study
10-25 16:54:58.879 27135-27135/com.example.lenovo.myintentservicedemo E/MIntentService--﹕ onDestroy
Intent服務(wù)開啟后,執(zhí)行完onHandleIntent里面的任務(wù)就自動銷毀結(jié)束逛揩,通過打印的線程名稱可以發(fā)現(xiàn)是新開了一個(gè)線程來處理耗時(shí)操作的柠傍,即是耗時(shí)操作也可以被這個(gè)線程管理和執(zhí)行麸俘,同時(shí)不會產(chǎn)生ANR的情況。