除非我們特別為某個操作指定特定的線程宜岛,否則大部分線程都在前臺UI界面上的執(zhí)行操作。這可能存在某些隱患功舀,因為部分在UI界面上的耗時操作可能會影響界面的響應(yīng)性能萍倡。UI界面的性能問題會容易惹惱用戶,甚至可能導致系統(tǒng)ANR錯誤辟汰。為了避免這樣的問題列敲,Android Framework提供了幾個類,用來幫助你把那些耗時操作移動到后臺線程中執(zhí)行帖汞。那些類中最常用的就是IntentService.
IntentService是繼承于Service并處理異步請求的一個類戴而,在IntentService內(nèi)有一個工作線程來處理耗時操作,啟動IntentService的方式和啟動傳統(tǒng)Service一樣翩蘸,同時所意,當任務(wù)執(zhí)行完后,IntentService會自動停止催首,而不需要我們?nèi)ナ謩涌刂品鲇弧A硗猓梢詥覫ntentService多次郎任,而每一個耗時操作會以工作隊列的方式在IntentService的onHandleIntent回調(diào)方法中執(zhí)行秧耗,并且,每次只會執(zhí)行一個工作線程舶治,執(zhí)行完第一個再執(zhí)行第二個绣版,以此類推。
而且歼疮,所有請求都在一個單線程中,不會阻塞應(yīng)用程序的主線程(UI Thread)诈唬,同一時間只處理一個請求韩脏。
IntentService 優(yōu)點
1.不需要我們在Service中手動開線程的麻煩
2.當操作完成時,我們不用手動停止Service铸磅。
IntentService有下面幾個局限性:
1.不可以直接和UI做交互赡矢。為了把他執(zhí)行的結(jié)果體現(xiàn)在UI上杭朱,需要把結(jié)果返回給Activity。
2.工作任務(wù)隊列是順序執(zhí)行的吹散,如果一個任務(wù)正在IntentService中執(zhí)行弧械,此時你再發(fā)送一個新的任務(wù)請求,這個新的任務(wù)會一直等待直到前面一個任務(wù)執(zhí)行完畢才開始執(zhí)行空民。
3.正在執(zhí)行的任務(wù)無法打斷刃唐。
使用
1.創(chuàng)建IntentService
public class MyService extends IntentService {
/**
*重寫無參構(gòu)造函數(shù)
*/
public MyService(){
super("test");
}
/**
* 創(chuàng)建一個IntentService。調(diào)用子類的構(gòu)造函數(shù)界轩。
*
* @param name 用于命名工作線程, 只有調(diào)試情況下使用.
*/
public MyService(String name) {
super(name);
}
@Override
protected void onHandleIntent(Intent intent) {
//任務(wù)隊列,此處可以進行耗時操作,并且自動排隊完成
......
......
}
}
2.在Manifest文件中定義IntentService
<service
android:name=".MyService"
android:exported="false"/>
在此<service>標簽并沒有包含任何intent filter画饥。因為發(fā)送任務(wù)給IntentService的Activity需要使用顯式Intent,所以不需要filter浊猾。這也意味著只有在同一個app或者其他使用同一個UserID的組件才能夠訪問到這個Service抖甘。
3.創(chuàng)建任務(wù)請求并發(fā)送到IntentService
例如在Activity中
Intent intent = new Intent(this, DownService.class);
// Bundle bundle = new Bundle();
// bundle.putString("videlURL" , videoUrl);
// bundle.putString("fileName" , fileName);
// intent.putExtras(bundle);
startService(intent);
當startService之后 我們的MyService 會執(zhí)行onHandleIntent方法,多次點擊會排隊之行該方法葫慎。
如果你打印LOG 并重寫 所有的 Service 生命周期方法衔彻,你會發(fā)現(xiàn),多次觸發(fā)startService(intent)的話偷办,onCreate方法只執(zhí)行了一次艰额,而onStartCommand方法執(zhí)行了兩次,開啟了兩個Work Thread爽篷,這就證實了之前所說的悴晰,啟動多次,但IntentService的實例只有一個逐工,這點跟Service是一致的铡溪。