基于PA的跨設備遷移功能及PageAbility代碼示例工程完全解
一、跨設備遷移
是什么:是一種基于Ability框架下的Page Ability的能力
遷移動作主要步驟:
- 源側設備上的Page請求遷移
- 源側設備回調保存數據方法
- 目標側設備啟動Page,回調恢復數據方法
請求遷移的兩種方法
- continue Ability()
- continueAbilityReversibly()
區別在于:continueAbility()不能進行回遷,continueAbilityReversibly()可以進行回遷
實現IAbilityContinuation接口
- onStartContinuation()
- onSaveData()
- onRestoreData()
- onCompleteContinuation()
- onFailedContinuation()
- onRemoteTerminated()
文字描述不夠清晰和直接,故用表的形式進行輸出
A作為源側向目標側B進行遷移其回調方法的順序是:
二、PageAbility代碼示例工程
本示例演示了同一Page Ability內和不同Page間的AbilitySlice導航,以及Page Ability的跨端遷移。
(一)項目演示
因為示例代碼的字真的小得讓人眼瞎,所以就調大了一點
跨設備遷移
同PA不同Page間的導航
(二)工程目錄及其Slice直接的關系
(三)同一PA導航與不同Page
同Page
Page內的AbilitySlice實例是以堆棧存放的,其頁內導航的數據傳遞是通過intent傳遞的,源頁面調用方法setParam(),其值是鍵值對。在跳轉頁面通過getParam進行接收(intent.getParam(key:“XX”))
目標頁面向源頁面傳遞數據,構建intent實例(返回數據的載體)-賦值給intent類型的resultIntent變量-調用方法setParam()(鍵值對的形式)-調用方法setResult()指定實例作為參數-在原頁面調用PresentForResult()(請求碼非負整數作為第三個參數用于標識某一次頁面導航)-重寫方法onResult(處理返回數據)-
不同Page
- 顯式:在觸發事件中構造Intent.OperationBuilder的實例-分別鏈式調用
- Operation operation=new Intent.OperationBuilder()
- withBundleName(getBundleName())
- .getAbilityName(目標Ability.class.getName())
- .build();
為了把目標Page的包名和類名都封裝在需要傳遞的Intent類型的實例navigation中,需要調用navigation的方法setOperation并指定才創建的Intent類型的實例operation為其參數。最后用startAbility且把navigation作為參數。
從目標頁面跳轉到源頁面且處理數據,需要在目標調用getAbility.setParam并設置響應碼(是用來標識一次響應)。之后在原頁面把startAbility變更為startAbilityForResult(響應碼)-把回調方法onResult替換為onAbilityResult(響應碼),
(四)跨設備遷移
- 設備A上的Page請求遷移。
- 系統回調設備A上Page及其AbilitySlice棧中所有AbilitySlice實例的IAbilityContinuation.onStartContinuation()方法,以確認當前是否可以立即遷移。
- 如果可以立即遷移,則系統回調設備A上Page及其AbilitySlice棧中所有AbilitySlice實例的IAbilityContinuation.onSaveData()方法,以便保存遷移后恢復狀態必須的數據。
- 如果保存數據成功,則系統在設備B上啟動同一個Page,并恢復AbilitySlice棧,然后回調IAbilityContinuation.onRestoreData()方法,傳遞此前保存的數據;此后設備B上此Page從onStart()開始其生命周期回調。
- 系統回調設備A上Page及其AbilitySlice棧中所有AbilitySlice實例的IAbilityContinuation.onCompleteContinuation()方法,通知數據恢復成功與否。
- 遷移過程中發生異常,系統回調設備A上Page及其AbilitySlice棧中所有AbilitySlice實例的IAbilityContinuation.onFailedContinuation()方法,通知遷移過程中發生異常,并不是所有異常都會回調FA此方法,僅局限于該接口枚舉的異常。
總結
跨設備遷移是基于分布式流轉操作的。是很有趣和很值得研究的功能
同Page,不同Page,不同設備。三種情況下Page生命周期需要搞懂,需要分清楚Page生命周期回調方法,與跨設備遷移中實現IAbilityContinuation接口的回調方法。一定注意源側與目標側的方法調用的順序。
對于基礎的Ability與Slice的關系、Slice與Layout(xml)的關系、Intent的理解得到了提升。