在Android開發(fā)中,Android四大組件是非常重要的,那么這其中包括哪四大組件?而其中的service生命周期是怎樣的呢?一起來看看吧!
Android四大組件基本介紹
Android四大基本組件分別是Activity,Service服務(wù),Content Provider內(nèi)容提供者,BroadcastReceiver廣播接收器。
service生命周期介紹
Android下的服務(wù)是在后臺(tái)運(yùn)行 也是沒有界面 可以理解成是沒有界面的Activity,Android系統(tǒng)會(huì)為每個(gè)
應(yīng)用程序創(chuàng)建一個(gè)進(jìn)程和線程(主線程),而開啟一個(gè)服務(wù)就會(huì)創(chuàng)建一個(gè)進(jìn)程,可以在后臺(tái)看到。
我們來分析一下進(jìn)程:
進(jìn)程按優(yōu)先級(jí)分5中:
1.Foreground process 前臺(tái)進(jìn)程,正在和用戶交互 相當(dāng)于Activity執(zhí)行了onResume方法這個(gè)進(jìn)程最不容易被系統(tǒng)殺死。
2.Visible Process 可視化進(jìn)程,用戶可以看得見,但用戶不能進(jìn)行交互,相當(dāng)于Activity執(zhí)行了onPause()方法。
3.Service Process 服務(wù)進(jìn)程 , 當(dāng)進(jìn)程里面通過startService開啟一個(gè)服務(wù),這時(shí)候就屬于服務(wù)進(jìn)程。
4. Background Process 后臺(tái)進(jìn)程, 相當(dāng)于Activity執(zhí)行了onStop()方法。
5. Empty Process 空進(jìn)程 空進(jìn)程不會(huì)維持任何運(yùn)行的組件,空進(jìn)程最容易被殺死,有時(shí)候它沒有被立刻殺死的目的是為下一次打開應(yīng)用程序時(shí)提供打開的速度。
在系統(tǒng)運(yùn)行內(nèi)存不足的情況下,會(huì)檢查正在正在運(yùn)行的進(jìn)程,殺死優(yōu)先級(jí)低的進(jìn)程來騰出內(nèi)存。
我們開啟服務(wù)有兩種方式: StartService() 和 BindService().
starService 開啟一個(gè)服務(wù),會(huì)執(zhí)行onCreate()方法,和onStart()方法,如果服務(wù)已經(jīng)開啟,只會(huì)執(zhí)行onStart()方法。
服務(wù)開啟后,就會(huì)在后臺(tái)長(zhǎng)期運(yùn)行,可以在設(shè)置界面找到,我們可以在設(shè)置界面手動(dòng)關(guān)閉它,服務(wù)就會(huì)停止運(yùn)行。
startService開啟服務(wù)也叫做非綁定模式開啟服務(wù) ,生命周期 第一次執(zhí)行的方法有 onCreate().onstartCommand(),到service關(guān)閉的時(shí)候執(zhí)行onDestroy()方法。
bindService開啟服務(wù)也叫做綁定模式開啟服務(wù),生命周期 第一次執(zhí)行的方法有 onCreate(), onBind()方法,
銷毀的時(shí)候執(zhí)行onUnBind(),onDestroy()方法, bindService開啟服務(wù)有個(gè)特點(diǎn),它在設(shè)置界面時(shí)找不到的,所以我們無法手動(dòng)在設(shè)置界面銷毀它,
不過它的生命周期依附于Activity,當(dāng)Activity銷毀的時(shí)候,這個(gè)服務(wù)也就跟著銷毀。
上面兩種生命周期實(shí)在相對(duì)單純的模式下的情形,我們?cè)陂_發(fā)的過程中還必須注意Service實(shí)例只會(huì)有一個(gè),也就是說如果當(dāng)前要啟動(dòng)的Service已經(jīng)存在了那么就不會(huì)再次創(chuàng)建該Service當(dāng)然也不會(huì)調(diào)用onCreate()方法;
一個(gè)Service可以被多個(gè)客戶進(jìn)行綁定,只有所有綁定對(duì)象都執(zhí)行了onBind()方法后該Service才會(huì)銷毀,不過如果有一個(gè)用戶執(zhí)行了onStart()方法,那么這個(gè)時(shí)候如果其他所有的bind客戶都執(zhí)行了unBind()。
該Service也不會(huì)銷毀,很多應(yīng)用都是用startService和bindService混合開啟服務(wù),比如音樂播放器,第三方支付等
這時(shí)我們可能會(huì)有一個(gè)疑問:既然有StartService開啟服務(wù),為什么還要用bindService開啟服務(wù)?
目的就是為了使用bindserivce調(diào)用服務(wù)里面的方法
這時(shí)就出現(xiàn)了解決進(jìn)程間的通信問題:IPC,
而使用IPC就需要使用 aidl.
aidl :Android inteface defation language Android接口定義語(yǔ)言
使用aidl語(yǔ)言的步驟
[1] 有一個(gè)服務(wù) 服務(wù)里面有一個(gè)方法 這個(gè)方法在另外一個(gè)應(yīng)用里面調(diào)用
[2]在服務(wù)的內(nèi)部定義一個(gè)中間人對(duì)象(IBinder的實(shí)例)
[3]在onbind方法里面把我們定義的中間人對(duì)象返回
[4]把你想暴露的方法都定義在接口里
[5]把定義的接口Iservice.java 文件變成aidl文件 注意aidl語(yǔ)言不認(rèn)識(shí)public
[6]系統(tǒng)會(huì)自動(dòng)生產(chǎn)一個(gè)Iservice.java文件 生產(chǎn)一個(gè)類 stub 系統(tǒng)會(huì)報(bào)錯(cuò). 把我們定義的中間人對(duì)象直接繼承Stub
[7]想保證2個(gè)應(yīng)用程序使用的是同一個(gè)aidl文件 谷歌要求aidl文件所生成的包名要相同
[8]獲取中間人對(duì)象方式不一樣 是通過stub類中的一個(gè)靜態(tài)方法獲取我們定義中間人對(duì)象
[9]通過獲取到的中間人對(duì)象,調(diào)用服務(wù)里面的方法,實(shí)現(xiàn)IPC通信。
兩種開啟服務(wù)的小Demo:
以上就是小編為大家?guī)淼脑敿?xì)介紹!更多相關(guān)資訊,敬請(qǐng)關(guān)注東坡下載!