Harmony系列之 初探Ability

欲開發(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ù)是否可交互劃分為 FeatureParticle兩種類型遂跟。

不同類型會根據(jù)其支持模板可再細(xì)分:

  1. Feature 目前僅支持Page模板,用于提供與用戶交互的能力婴渡,包括寫視圖組件等幻锁。
  2. 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)可見下圖追驴。

file

下面針對核心方法做簡單闡述:

  • 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)缀去。

file

對于 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 也沒有注釋吶。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骗卜,一起剝皮案震驚了整個濱河市宠页,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寇仓,老刑警劉巖举户,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異遍烦,居然都是意外死亡俭嘁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門服猪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來供填,“玉大人,你說我怎么就攤上這事罢猪〗” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵坡脐,是天一觀的道長泄私。 經(jīng)常有香客問我,道長备闲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任捅暴,我火速辦了婚禮恬砂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蓬痒。我一直安慰自己泻骤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布梧奢。 她就那樣靜靜地躺著狱掂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亲轨。 梳的紋絲不亂的頭發(fā)上趋惨,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機(jī)與錄音惦蚊,去河邊找鬼器虾。 笑死讯嫂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的兆沙。 我是一名探鬼主播欧芽,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼葛圃!你這毒婦竟也來了千扔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤库正,失蹤者是張志新(化名)和其女友劉穎昏鹃,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诀诊,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洞渤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了属瓣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片载迄。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抡蛙,靈堂內(nèi)的尸體忽然破棺而出护昧,到底是詐尸還是另有隱情,我是刑警寧澤粗截,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布惋耙,位于F島的核電站,受9級特大地震影響熊昌,放射性物質(zhì)發(fā)生泄漏绽榛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一婿屹、第九天 我趴在偏房一處隱蔽的房頂上張望灭美。 院中可真熱鬧,春花似錦昂利、人聲如沸届腐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽犁苏。三九已至,卻和暖如春扩所,著一層夾襖步出監(jiān)牢的瞬間围详,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工碌奉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留短曾,地道東北人寒砖。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像嫉拐,于是被迫代替她去往敵國和親哩都。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容