您好,登錄后才能下訂單哦!
繼承關系
Context -> ContextWrapper -> Service 位于 android.app 包中
一、生命周期?
onCreate():首次創建服務時調用,該方法只調用一次。
onStartCommand():當另一個組件通過調用startService()請求啟動服務時,系統將調用此方法。
onDestroy():當服務不再使用且將被銷毀時,系統將調用此方法。
onBind():當調用bindService()與服務綁定時,調用此方法。
onUnbind():當調用unbindService()與服務解綁時,調用此方法。
onRebind():當舊的組件與服務解綁后,另一個新的組件與服務綁定,onUnbind()返回true時,系統將調用此方法。
參考:https://www.jianshu.com/p/cc25fbb5c0b3
二、重要屬性?
android:enabled=[“true” | “false”]
是否可實例化,默認true 。如設置false ,Service將不可用
android:exported=[“true” |”false”]
是否允許跨進程調用,默認值跟filter是否有子元素有關,filter子元素個數為0,默認值為false ,否則true
android:permission=”string”
調用此Service需要的權限,可自定義權限增加Service安全。如沒設置,此Service就沒權限要求。
android:process=”:String”
給Service指定運行的進程。未設置默認為應用主進程。如設置,
首字母大寫 代表此新進程為本應用私有進程,其它應用不可訪問。
首字母小寫 代表此進程為全局進程(公共),其它應用可訪問
android:isolatedProcess=[“true” | “false”]
如果設置為true,這個服務將運行在專門的進程中,這個進程從系統的剩余部分獨立出來,它自身沒有權限。同它唯一的通信方式就是通過這個Service API(binding或starting)。?
三、啟動方式
1.StartService 同一個Service Start多次,onCreate()執行一次,onStartCommand()執行多次
2.BindService 同一個Service bind多次, onCreate()執行一次,onBind()也執行一次
生命周期調用
1)啟動Service服務
單次:startService() —> onCreate() —> onStartCommand()
多次:startService() —> onCreate() —> onStartCommand() —> onStartCommand()
2)停止Service服務
stopService() —> onDestroy()
3)綁定Service服務
bindService() —> onCreate() —> onBind()
4)解綁Service服務
unbindService() —> onUnbind() —> onDestroy()
5)啟動綁定Service服務
startService() —> onCreate() —> onStartCommand() —> bindService() —> onBind()
6)解綁停止Service服務
unbindService() —> onUnbind()?
?stopService()? —> onDestroy()
當同時使用startService與bindService的Service關閉需unbindService與stopService同時調用(調用順序無所謂),才能終止Service.
7)解綁綁定Service服務
unbindService() —> onUnbind(ture) —> bindService() —> onRebind()
Service關閉方法
1.stopSelf();
2.stopSelfResult();
3.stopService()
四、進程保活
1、關鍵2點
提高進程的優先級
在進程被kill之后能夠喚醒
2、進程優先級劃分
1.前臺進程 (Foreground process)
2.可見進程 (Visible process)
3.服務進程 (Service process)
4.后臺進程 (Background process)
5.空進程 (Empty process)
這是一種粗略的劃分,進程其實有一種具體的數值,稱作oom_adj,注意:數值越大優先級越低
3、提高進程的優先級
配置文件提升Service優先級和app系統級別
<service
android:name=”…”
android:exported =”false”
android:persistent=”true” //提升應用到系統級
/>
<intent-filter android:priority=”1000″/>//提高優先級 1000是最高優先級,數字越小,優先級越低
</service>
切后臺 ->? 彈通知
隱藏通知欄iocn
對于 API level < 18 :調用startForeground(ID, new Notification()),發送空的Notification ,圖標則不會顯示。
對于18 <= API level <25:在需要提優先級的service A啟動一個InnerService,兩個服務同時startForeground,且綁定同樣的 ID。Stop 掉InnerService ,這樣通知欄圖標即被移除。
參考:https://blog.csdn.net/xutao123111/article/details/78994383
8.0上述方案無效,會顯示”有一個應用正在后臺使用” ,想要去除,官方建議使用JetPack-WorkManager https://www.jianshu.com/p/de19752f159c
鎖屏 ->? 彈1像素界面
注冊廣播監聽鎖屏和解鎖事件, 鎖屏后啟動一個1像素的透明Activity,這樣直接把進程的oom_adj數值降低到0,0是android進程的最高優先級。 解鎖后銷毀這個透明Activity
4、進程被kill
系統內存不足殺死情況
在onStartCommand()返回值修改為START_STICKY,在onDestory重啟(不保證100%重啟成功)
Service 第一次被異常殺死后會在5秒內重啟,第二次被殺死會在10秒內重啟,第三次會在20秒內重啟,一旦在短時間內 Service 被殺死達到5次,則系統不再拉起。
進程被取得 Root 權限的管理工具或系統工具通過 forestop 停止掉,無法重啟。
用戶手動使用手機自帶清理工具和第三方app(360,獵豹清理大師等)
引導用戶添加手機白名單
? 其它
?? ? 依賴push、第3方應用喚醒、廠家白名單等
備注:
對于Android6.0以及以下的大部分機型還是有效果的,但是Android7.0和Android8.0基本上所有機型全部陣亡,大部分后臺進程在鎖屏后無法存活超過20分鐘
測試結果顯示,oppo/vivo這兩家廠商進程保活最困難,小米和三星比較寬松。其他的機型居中。
參考
https://www.jianshu.com/p/53c4d8303e19
https://blog.csdn.net/qq_37199105/article/details/81224842
五.其它
1. bindService和startService區別
生命周期不同? bindService -> onBind() ? startService->onStartCommand(),?
方法調用次數不同? 多次startService onStartCommand會執行多次 ,而bindService只會指定一次
關閉服務? ? bindService開啟服務以后,與activity存在關聯,退出時必須調用unbindService方法,否則會報ServiceConnection泄漏的錯誤。而Service不用。
2.IntentService
優點:
省去在 Service 中手動開線程的麻煩
當操作完成時,我們不用手動停止 Service
原理 (單線程HandlerThread? 隊列串行處理)
IntentService采用Handler & HandlerThread方式
所有請求都在一個單線程中,不會阻塞應用程序的主線程(UI Thread),同一時間只處理一個請求
可啟動 IntentService 多次,而每一個耗時操作會以工作隊列的方式在IntentService 的 onHandleIntent 回調方法中執行,并且,每次只會執行一個工作線程,執行完第一個再執行第二個,以此類推。
IntentService 會自動停止,而不需要我們去手動控制
參考:https://www.jianshu.com/p/5a32226d2ce0
3.Service 與Thread、Application的區別
????????????????????????????????????Thread ? ? ? ? ? ? ? ? ? ? ? ? ? ? Service ? ? ? ? ? ? ? ? ? ? ? Application
是否可設置獨立進程? ? ? ? ? ? ?否 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?是? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?否
是否能管理生命周期? ? ? ? ? ? ?否 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?是? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?是
是否能與其它組件通信? ? ? ?較麻煩 ? ? ? ? ? ? ? ? ? ? ? ? ? ? 較易? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?一般
? ?
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。