.清單文件中沒有加service字段,即使service是jar包中的,也須要在清單文件中註冊函數
2.遠程服務沒有啓動代理
在Android中,當咱們跨進程啓動或者綁定一個Service,當時不能保證第一次就能成功,好比,遠程的Service還沒起啓動成功,須要過一段時間才行,當沒有綁定成功後,咱們經過aidl來調用RemoteServcie就會出現Null錯誤,即ServiceConnection中的onServiceConnected()還未被回調,沒有給本地遠程服務代理賦值。隊列
爲了解決綁定或者啓動沒有成功的問題,咱們可使用循環綁定策略,即發現並未綁定成功,咱們再次綁定,可是又不能無限循環,由於,假如遠程就是沒有了,無限循環綁定就會出現錯誤。因此必須還有定個循環綁定次數。進程
當咱們使用遠程Service的本地代理時候,先判斷它是否爲null,若爲null,則執行循環綁定操做,而且制定一個循環綁定次數限制,好比是3,每次循環後次數限制就作減一操做,當減爲0時候,表示遠程服務出現錯誤,則再也不執行循環綁定操做。ci
在執行循環綁定操做時候,咱們可使用延遲綁定操做,就是延遲幾毫秒再綁定,這樣,就確保Remote Service啓動時間是足夠的。能夠經過編寫一個Handler,使用handler.sendMessageDelayde(Messagee msg, long delayMillis)操做來延遲。io
3.服務本身銷燬ast
當咱們實現本身的aidl的Service時候,咱們須要本身銷燬Servcie,由於外界可能只是startService(),並不會調用stopServcie()操做,另外一方面,當咱們Service作完工做後,將本身銷燬,也節省cpu,所以本身銷燬Servcie就顯得很是重要。cli
Service中,本身銷燬操做就是自己調用stopSelf()函數,可是什麼時候調用該函數纔是重點,咱們能夠經過任務隊列實現。循環
當Service中,咱們爲全部Tasks建立一個隊列,當client端調用Service時候,每推動一個Task,就將該Task插入到該隊列中,當執行完一個Task後,就從隊列中刪除,而後判斷該隊列是否爲空,若爲空則執行stopService()操做。(我的喜歡broadcast來處理)
---------------------
service