欲開發(fā)鴻蒙應(yīng)用呵哨,須先搞懂 Ability刹前。
Ability是什么
官方定義Ability 是應(yīng)用所具備能力的抽象毛嫉,也是應(yīng)用程序的重要組成部分袱饭。
它是可見的川无,承載一個業(yè)務(wù)可視化界面;亦可為隱藏的虑乖,在背后默默為你干臟活懦趋;又能在多應(yīng)用間架起數(shù)據(jù)訪問的橋梁,方便數(shù)據(jù)溝通疹味。
鴻蒙應(yīng)用是以 Ability 為單位進(jìn)行部署仅叫,開發(fā)者通過繼承 Ability 類來實(shí)現(xiàn)應(yīng)用所需能力。
如果從安卓 API 能力角度上看佛猛,鴻蒙OS的 Ability 提供的能力囊括了 Activity惑芭、Service、ContentProvider继找。
Ability 根據(jù)是否可交互劃分為 Feature和Particle兩種類型遂跟。
不同類型會根據(jù)其支持模板可再細(xì)分:
- Feature 目前僅支持Page模板,用于提供與用戶交互的能力婴渡,包括寫視圖組件等幻锁。
- Particle 支持Service模板和Data模板,前者用于提供后臺運(yùn)行任務(wù)的能力边臼,后者對外提供數(shù)據(jù)訪問的能力哄尔。
怎么使用 Ability
只能直接繼承來實(shí)現(xiàn)不同模板能力,而不同模板實(shí)現(xiàn)的子類需要主動選擇覆蓋對應(yīng)方法柠并。
比如可視化的 Page 模板關(guān)注的是頁面生命周期變化岭接,所以重載的方法主要是生命周期變化的回調(diào)方法富拗。
而 Service 模板更關(guān)注的是服務(wù)的連接與斷開,重載的方法則與 Page 模板不一樣鸣戴。
說實(shí)話這樣的設(shè)計并不好啃沪,針對模板分類封裝 Ability 顯然更友好。
我們以可視化 Page 模板作為例子展開窄锅。
編寫一個閃屏頁面
public class SplashScreenAbility extends Ability {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
//視圖片创千,后面會有講到
super.setMainRoute(SplashScreenAbilitySlice.class.getName());
}
}
可以看到我們重載的 onStart 方法。
onStart只是系統(tǒng)首次創(chuàng)建 Page 時的回調(diào)入偷,對于頁面的生命周期的狀態(tài)轉(zhuǎn)化及對應(yīng)回調(diào)可見下圖追驴。
下面針對核心方法做簡單闡述:
- onStart,當(dāng)系統(tǒng)首次創(chuàng)建 Page 實(shí)例時觸發(fā)該回調(diào)疏之。對于一個 Page 實(shí)例殿雪,該回調(diào)在其生命周期過程中僅觸發(fā)一次, 此后進(jìn)入 INACTIVE 狀態(tài)体捏。開發(fā)者必須重寫該方法冠摄,并在此配置默認(rèn)展示的 AbilitySlice糯崎。
- onActive几缭,Page 會在進(jìn)入 INACTIVE 狀態(tài)后來到前臺,然后系統(tǒng)調(diào)用此回調(diào)沃呢。在此之后進(jìn)入 ACTIVE 狀態(tài)年栓,該狀態(tài)是應(yīng)用與用戶交互的狀態(tài)。
- onInactive薄霜,Page 失去焦點(diǎn)時系統(tǒng)將調(diào)用此回調(diào)某抓,此后 Page 進(jìn)入 INACTIVE 狀態(tài)。
- onBackground惰瓜,如果 Page 不再對用戶可見否副,系統(tǒng)將調(diào)用此回調(diào)通知開發(fā)者用戶進(jìn)行相應(yīng)的資源釋放,此后 Page 進(jìn)入 BACKGROUND 狀態(tài)崎坊。
- onForeground备禀,處于 BACKGROUND 狀態(tài)的 Page 仍然駐留在內(nèi)存中,當(dāng)重新回到前臺時(比如用戶重新導(dǎo)航到此 Page )奈揍,系統(tǒng)將先調(diào)用 onForeground() 回調(diào)通知開發(fā)者曲尸,而后 Page 的生命周期狀態(tài)回到 INACTIVE 狀態(tài)。開發(fā)者應(yīng)當(dāng)在此回調(diào)中重新申請在 onBackground() 中釋放的資源男翰,最后 Page 的生命周期狀態(tài)進(jìn)一步回到 ACTIVE 狀態(tài)另患,系統(tǒng)將通過 onActive() 回調(diào)通知開發(fā)者用戶。
- onStop蛾绎,系統(tǒng)將要銷毀 Page 時昆箕,將會觸發(fā)此回調(diào)函數(shù)鸦列,通知用戶進(jìn)行系統(tǒng)資源的釋放。
對比安卓 Activity 生命周期回調(diào)(左鴻蒙右安卓)
onStart() --> onCreate()
onActive() --> onResume()
onInactive() --> onPause()
onBackground() --> onStop()
onForeground() --> onRestart()
onStop() --> onDestroy()
生命周期變化規(guī)律的回調(diào)看起來確實(shí)很像 Activity場景鹏倘,但在視圖編寫流程上卻有些差異敛熬。
例子代碼中出現(xiàn)的 SplashScreenAbilitySlice 實(shí)際上才是真正承載視圖邏輯的類。
其繼承的是 AbilitySlice 類第股,通過 supe#setMainRoute 的方法來導(dǎo)航到真正視圖界面应民。
那么 AbilitySlice 是什么呢?
官方定義為AbilitySlice 作為 Page 的組成單元夕吻,其生命周期是依托于其所屬 Page 生命周期诲锹。
AbilitySlice 和 Page 具有相同的生命周期狀態(tài)和同名的回調(diào),當(dāng) Page 生命周期發(fā)生變化時涉馅,它的 AbilitySlice 也會發(fā)生相同的生命周期變化归园。
|---AbilityContext
| |---Ability
| |---AbilitySlice //Page組成元素
都繼承自 AbilityContext,實(shí)現(xiàn)的方法大致相同稚矿。
只是 AbilitySlice 比 Page 多了一些生命周期變化庸诱,這些變化發(fā)生在同一 Page 中的多個 AbilitySlice 之間導(dǎo)航時,但此時 Page 的生命周期狀態(tài)并不會改變晤揣。
AbilitySlice 跟 Fragment 有點(diǎn)像桥爽,只是 Page 必須通過設(shè)置 AbilitySlice 展示頁面視圖。
以下是 SplashScreenAbilitySlice 簡單實(shí)現(xiàn)昧识。
public class SplashScreenAbilitySlice extends AbilitySlice {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_splash_screen_layout);
}
}
上述代碼通過調(diào)用 setUIContent 設(shè)置布局钠四。
Demo 實(shí)現(xiàn)一個完整的閃屏邏輯,效果如下跪楞,感興趣可到 Github 查看實(shí)現(xiàn)缀去。
對于 Service 模板及 Data 模板,則直接覆蓋對應(yīng)方法即可甸祭,這部分暫不過多描述缕碎,細(xì)節(jié)可到 HarmonyOS Developer 開發(fā)文檔 中查閱。
既然 Ability 劃分多種模板池户,那么應(yīng)用如何區(qū)分這些模板呢咏雌?
區(qū)分 Ability 模板
在《Harmony系列之 工程結(jié)構(gòu)與應(yīng)用配置的理解》一文中我們有講過在每個模塊都會有一個 config.json 配置文件。
而這個文件的 module 節(jié)點(diǎn)中需要申明應(yīng)用所需要用到的 Ability煞檩。
"abilities": [
{
"orientation": "portrait",
"name": "com.effective.harmony.study.ability.page.SplashScreenAbility",
"type": "page",
},
{
"name": "com.effective.harmony.study.ability.service.ServiceAbility",
"type": "service",
}
]
如上圖处嫌,申明了 SplashScreenAbility 為 Page模板,ServiceAbility 為 Service模板斟湃。
這一點(diǎn)和安卓應(yīng)用中 AndroidManifest.xml 需要申明四大組件邏輯是一致的熏迹。
雖然目前官方 SDK 源碼并沒有開源,但在 Framework 層應(yīng)該是對應(yīng)類型進(jìn)行分類凝赛,并在各自模板場景下做方法映射調(diào)用注暗。
初探Ability至此坛缕,但我更好奇的是 Framework 層的實(shí)現(xiàn)。
遺憾的是捆昏,目前 SDK 目前還沒有開源赚楚,API 也沒有注釋吶。