ContextWrapper -> Service 位于 android.app 包中一、生命周期?onCreate():首次創(chuàng)建服務(wù)時(shí)調(diào)用,該方法只調(diào)用一次。onStartCommand():當(dāng)..."/>
溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

四大組件(2) - Service

發(fā)布時(shí)間:2020-07-22 16:02:55 來(lái)源:網(wǎng)絡(luò) 閱讀:109 作者:lm8751 欄目:移動(dòng)開發(fā)

繼承關(guān)系

Context -> ContextWrapper -> Service 位于 android.app 包中

、生命周期?

onCreate():首次創(chuàng)建服務(wù)時(shí)調(diào)用,該方法只調(diào)用一次。

onStartCommand():當(dāng)另一個(gè)組件通過(guò)調(diào)用startService()請(qǐng)求啟動(dòng)服務(wù)時(shí),系統(tǒng)將調(diào)用此方法。

onDestroy():當(dāng)服務(wù)不再使用且將被銷毀時(shí),系統(tǒng)將調(diào)用此方法。

onBind():當(dāng)調(diào)用bindService()與服務(wù)綁定時(shí),調(diào)用此方法。

onUnbind():當(dāng)調(diào)用unbindService()與服務(wù)解綁時(shí),調(diào)用此方法。

onRebind():當(dāng)舊的組件與服務(wù)解綁后,另一個(gè)新的組件與服務(wù)綁定,onUnbind()返回true時(shí),系統(tǒng)將調(diào)用此方法。

參考:https://www.jianshu.com/p/cc25fbb5c0b3



、重要屬性?

android:enabled=[“true | false”]

是否可實(shí)例化,默認(rèn)true 。如設(shè)置false ,Service將不可用

android:exported=[“true |false”]

是否允許跨進(jìn)程調(diào)用,默認(rèn)值跟filter是否有子元素有關(guān),filter子元素個(gè)數(shù)為0,默認(rèn)值為false ,否則true

android:permission=string

調(diào)用此Service需要的權(quán)限,可自定義權(quán)限增加Service安全。如沒設(shè)置,此Service就沒權(quán)限要求。

android:process=:String

Service指定運(yùn)行的進(jìn)程。未設(shè)置默認(rèn)為應(yīng)用主進(jìn)程。如設(shè)置,

首字母大寫 代表此新進(jìn)程為本應(yīng)用私有進(jìn)程,其它應(yīng)用不可訪問(wèn)。

首字母小寫 代表此進(jìn)程為全局進(jìn)程(公共),其它應(yīng)用可訪問(wèn)

android:isolatedProcess=[“true | false”]

如果設(shè)置為true,這個(gè)服務(wù)將運(yùn)行在專門的進(jìn)程中,這個(gè)進(jìn)程從系統(tǒng)的剩余部分獨(dú)立出來(lái),它自身沒有權(quán)限。同它唯一的通信方式就是通過(guò)這個(gè)Service APIbindingstarting)。?



啟動(dòng)方式

1.StartService 同一個(gè)Service Start多次,onCreate()執(zhí)行一次,onStartCommand()執(zhí)行多次

2.BindService 同一個(gè)Service bind多次, onCreate()執(zhí)行一次,onBind()也執(zhí)行一次

生命周期調(diào)用

1)啟動(dòng)Service服務(wù)

單次:startService() —> onCreate() —> onStartCommand()

多次:startService() —> onCreate() —> onStartCommand() —> onStartCommand()

2)停止Service服務(wù)

stopService() —> onDestroy()

3)綁定Service服務(wù)

bindService() —> onCreate() —> onBind()

4)解綁Service服務(wù)

unbindService() —> onUnbind() —> onDestroy()

5)啟動(dòng)綁定Service服務(wù)

startService() —> onCreate() —> onStartCommand() —> bindService() —> onBind()

6)解綁停止Service服務(wù)

unbindService() —> onUnbind()?

?stopService()? —> onDestroy()

當(dāng)同時(shí)使用startServicebindServiceService關(guān)閉需unbindServicestopService同時(shí)調(diào)用(調(diào)用順序無(wú)所謂),才能終止Service.

7)解綁綁定Service服務(wù)

unbindService() —> onUnbind(ture) —> bindService() —> onRebind()


Service關(guān)閉方法

1.stopSelf();

2.stopSelfResult();

3.stopService()



四、進(jìn)程?;?/strong>

1、關(guān)鍵2點(diǎn)

  • 提高進(jìn)程的優(yōu)先級(jí)

  • 在進(jìn)程被kill之后能夠喚醒

2、進(jìn)程優(yōu)先級(jí)劃分

  • 1.前臺(tái)進(jìn)程 (Foreground process)

  • 2.可見進(jìn)程 (Visible process)

  • 3.服務(wù)進(jìn)程 (Service process)

  • 4.后臺(tái)進(jìn)程 (Background process)

  • 5.空進(jìn)程 (Empty process)

這是一種粗略的劃分,進(jìn)程其實(shí)有一種具體的數(shù)值,稱作oom_adj,注意:數(shù)值越大優(yōu)先級(jí)越低


3、提高進(jìn)程的優(yōu)先級(jí)

  • 配置文件提升Service優(yōu)先級(jí)和app系統(tǒng)級(jí)別

<service

android:name=

android:exported =false

android:persistent=true //提升應(yīng)用到系統(tǒng)級(jí)

/>

<intent-filter android:priority=1000″/>//提高優(yōu)先級(jí) 1000是最高優(yōu)先級(jí),數(shù)字越小,優(yōu)先級(jí)越低

</service>

  • 切后臺(tái) ->? 彈通知

隱藏通知欄iocn

對(duì)于 API level < 18 :調(diào)用startForeground(ID, new Notification()),發(fā)送空的Notification ,圖標(biāo)則不會(huì)顯示。

對(duì)于18 <= API level <25:在需要提優(yōu)先級(jí)的service A啟動(dòng)一個(gè)InnerService,兩個(gè)服務(wù)同時(shí)startForeground,且綁定同樣的 ID。Stop InnerService ,這樣通知欄圖標(biāo)即被移除。

參考:https://blog.csdn.net/xutao123111/article/details/78994383

8.0上述方案無(wú)效,會(huì)顯示”有一個(gè)應(yīng)用正在后臺(tái)使用” ,想要去除,官方建議使用JetPack-WorkManager https://www.jianshu.com/p/de19752f159c

  • 鎖屏 ->? 1像素界面

注冊(cè)廣播監(jiān)聽鎖屏和解鎖事件, 鎖屏后啟動(dòng)一個(gè)1像素的透明Activity,這樣直接把進(jìn)程的oom_adj數(shù)值降低到0,0android進(jìn)程的最高優(yōu)先級(jí)。 解鎖后銷毀這個(gè)透明Activity

4、進(jìn)程被kill

  • 系統(tǒng)內(nèi)存不足殺死情況

onStartCommand()返回值修改為START_STICKY,在onDestory重啟(不保證100%重啟成功)

Service 第一次被異常殺死后會(huì)在5秒內(nèi)重啟,第二次被殺死會(huì)在10秒內(nèi)重啟,第三次會(huì)在20秒內(nèi)重啟,一旦在短時(shí)間內(nèi) Service 被殺死達(dá)到5次,則系統(tǒng)不再拉起。

進(jìn)程被取得 Root 權(quán)限的管理工具或系統(tǒng)工具通過(guò) forestop 停止掉,無(wú)法重啟。

  • 用戶手動(dòng)使用手機(jī)自帶清理工具和第三方app360,獵豹清理大師等)

引導(dǎo)用戶添加手機(jī)白名單

  • ? 其它

?? ? 依賴push、第3方應(yīng)用喚醒、廠家白名單等


備注:

對(duì)于Android6.0以及以下的大部分機(jī)型還是有效果的,但是Android7.0Android8.0基本上所有機(jī)型全部陣亡,大部分后臺(tái)進(jìn)程在鎖屏后無(wú)法存活超過(guò)20分鐘

測(cè)試結(jié)果顯示,oppo/vivo這兩家廠商進(jìn)程?;钭罾щy,小米和三星比較寬松。其他的機(jī)型居中。


參考

https://www.jianshu.com/p/53c4d8303e19

https://blog.csdn.net/qq_37199105/article/details/81224842




.其它

1. bindServicestartService區(qū)別

  • 生命周期不同? bindService -> onBind() ? startService->onStartCommand(),?

  • 方法調(diào)用次數(shù)不同? 多次startService onStartCommand會(huì)執(zhí)行多次 ,而bindService只會(huì)指定一次

  • 關(guān)閉服務(wù)? ? bindService開啟服務(wù)以后,與activity存在關(guān)聯(lián),退出時(shí)必須調(diào)用unbindService方法,否則會(huì)報(bào)ServiceConnection泄漏的錯(cuò)誤。而Service不用。

2.IntentService

優(yōu)點(diǎn):

  • 省去在 Service 中手動(dòng)開線程的麻煩

  • 當(dāng)操作完成時(shí),我們不用手動(dòng)停止 Service

原理 (單線程HandlerThread? 隊(duì)列串行處理)

  • IntentService采用Handler & HandlerThread方式

  • 所有請(qǐng)求都在一個(gè)單線程中,不會(huì)阻塞應(yīng)用程序的主線程(UI Thread),同一時(shí)間只處理一個(gè)請(qǐng)求

  • 可啟動(dòng) IntentService 多次,而每一個(gè)耗時(shí)操作會(huì)以工作隊(duì)列的方式在IntentService onHandleIntent 回調(diào)方法中執(zhí)行,并且,每次只會(huì)執(zhí)行一個(gè)工作線程,執(zhí)行完第一個(gè)再執(zhí)行第二個(gè),以此類推。

  • IntentService 會(huì)自動(dòng)停止,而不需要我們?nèi)ナ謩?dòng)控制

參考:https://www.jianshu.com/p/5a32226d2ce0


3.Service ThreadApplication的區(qū)別

????????????????????????????????????Thread ? ? ? ? ? ? ? ? ? ? ? ? ? ? Service ? ? ? ? ? ? ? ? ? ? ? Application

是否可設(shè)置獨(dú)立進(jìn)程? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

是否能管理生命周期? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

是否能與其它組件通信? ? ? ?較麻煩 ? ? ? ? ? ? ? ? ? ? ? ? ? ? 較易? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?一般





? ?


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI