眾所周知,android有四大組件,service,activity,Content provider和BroadCast Recevicer,
activity應該是最先接觸到,也是接觸的最多的一個組件了,說起來,我到現在還沒有用過廣播,其他三個或多或少接觸了一下,
今天重點講一下service,這一塊看了之后個人感覺很簡單,就是一些概念理解了就很好了,
貼一下關于service官方檔案的地址:https://developer.android.google.cn/guide/components/services
service為后臺服務,一開始看到這個的時候,我以為是跟thread差不多的東西,實際上這兩個完全一樣,service其實還是在主執行緒里的,如果在service中加了耗時操作,還是會引起anr的,他這個正確理解應該是應用在后臺時呼叫的操作,因為此時ui無需渲染,
在service中可以創建thread來執行耗時任務,那既然如此為什么不直接在activity創建一個thread呢,就省的去創建service了,的確有些場景是可以這么做的,但是,如果你的應用在后臺,開了一個thread在執行,然后被系統殺死了,任務進行到一半就沒了,但是service相比于thread和activity更不容易被系統殺死,大多數情況下,service還是存在的,當然如果是希望thread和activity共存亡的情況下,還是不需要要新建一個service的,
然后android還有一種特殊的thread,叫做handlerThread,這個東西繼承自Thread,加了looper,對于android來說用起來是比thread好用的,
官方檔案在講service的時候推薦了IntentService,這個東西比較神奇,相當于上面說的handlerThread+service,也就是說你無需在service中添加thread了,他跟service相比有了作業佇列的概念,比如你啟動了四次intentservice,他就會按照順序,一個執行完執行下一個,然后執行完畢之后自動退出,且后執行的任務有可能會收到前面執行的任務的影響,如下圖

如果你過分一點,開啟四個然后馬上點擊關閉服務,他會把當前的任務做完,然后關閉服務,如下圖

這里i am killed是在ondestory中列印的,這個任務其實是耗時五秒列印一下,然后結束,也就是是說他雖然會先執行onDestory,但是正在執行的任務還是會執行完,知道了這個機制的話,就要注意不要在這里搞個死回圈就好了,
然后就是和activity之間的互動了,IntentService啟動需要用intent來,所以activity傳遞資料就直接放在Intent里就好了,那么IntentService怎么通知activity呢,這方面和service相同,我粗略的找了一下有三種,自身的binder機制,廣播,eventbus,這三種下次再說,
然后這邊看下代碼,
IntentService怎么說都算是service,所以需要startService和StopService,
Intent intent = new Intent(this,StudyIntentService.class); //啟動服務 this.startService(intent); //停止服務 this.stopService(intent);
其中intent可以夾帶資料,
IntentService比較簡單就直接把代碼貼上,
public class StudyIntentService extends IntentService { int i = 0; /** * @deprecated */ public StudyIntentService() { super("name"); Log.i("Tag","name:"); } @Override protected void onHandleIntent(@Nullable Intent intent) {try { i++; Log.i("Tag","onHandleIntent"+i); Thread.sleep(5000); Log.i("Tag","onHandleIntent5000"); } catch (InterruptedException e) { // Restore interrupt status. Thread.currentThread().interrupt(); } } @Override public void onDestroy() { super.onDestroy(); Log.i("Tag","i am killed!"); } }
這里定義了一個全域變數i,用以證明多次啟動IntentService啟動的是同一個service,然后在onHandleIntent中有個引數intent,這里可以決議從activity傳過來的資料,然后進行處理,
然后一些生命周期可以自行翻檔案去熟悉,也沒別的好說的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/164814.html
標籤:Android
