HarmonyOS Sample 之 AbilityInteraction設(shè)備遷移
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
AbilityInteraction設(shè)備遷移
介紹
本示例演示了Feature Ability的基本交互和跨設(shè)備遷移的功能。
在終端A隨機生成一個數(shù)字,并計算這個數(shù)的平方值,然后將這個數(shù)傳遞給終端B,在終端B中同樣計算出結(jié)果。
效果展示
搭建環(huán)境
安裝DevEco Studio,詳情請參考DevEco Studio下載。
設(shè)置DevEco Studio開發(fā)環(huán)境,DevEco Studio開發(fā)環(huán)境需要依賴于網(wǎng)絡(luò)環(huán)境,需要連接上網(wǎng)絡(luò)才能確保工具的正常使用,可以根據(jù)如下兩種情況來配置開發(fā)環(huán)境:
如果可以直接訪問Internet,只需進(jìn)行下載HarmonyOS SDK操作。
如果網(wǎng)絡(luò)不能直接訪問Internet,需要通過代理服務(wù)器才可以訪問,請參考配置開發(fā)環(huán)境。
實現(xiàn)步驟
1.config.json聲明使用跨設(shè)備遷移的權(quán)限
- "reqPermissions": [
- {
- "name": "ohos.permission.DISTRIBUTED_DATASYNC"
- }
- ]
2.Ability實現(xiàn)IAbilityContinuation接口及相關(guān)方法
- public class FirstAbility extends Ability implements IAbilityContinuation {
- ...
- }
3.Ability中申請用戶對敏感權(quán)限授權(quán)
- @Override
- public void onStart(Intent intent) {
- super.onStart(intent);
- super.setMainRoute(FirstAbilitySlice.class.getName());
- requestPermission();
- }
- private void requestPermission() {
- if (verifySelfPermission(SystemPermission.DISTRIBUTED_DATASYNC) != IBundleManager.PERMISSION_GRANTED) {
- requestPermissionsFromUser(new String[] {SystemPermission.DISTRIBUTED_DATASYNC}, 0);
- }
- }
4.Ablity中下面幾個方法全部返回true
- @Override
- public boolean onStartContinuation() {
- return true;
- }
- @Override
- public boolean onSaveData(IntentParams intentParams) {
- return true;
- }
- @Override
- public boolean onRestoreData(IntentParams intentParams) {
- return true;
- }
- @Override
- public void onCompleteContinuation(int i) {
- terminateAbility();
- }
5.Slice實現(xiàn)IAbilityContinuation接口及相關(guān)方法
- public class FirstAbilitySlice extends AbilitySlice implements LifecycleStateObserver, IAbilityContinuation {
- ...
- }
6.Slice按鈕事件監(jiān)聽
- private void initComponents() {
- findComponentById(ResourceTable.Id_enter_second).setClickedListener(component -> startSecondAbility());
- findComponentById(ResourceTable.Id_continue_ability).setClickedListener(component -> startContinue());
- numberText = (Text) findComponentById(ResourceTable.Id_number);
- lifecycleState = (Text) findComponentById(ResourceTable.Id_lifecycle_state);
- }
7.Slice中實現(xiàn)設(shè)備遷移的方法
- private void startContinue() {
- try {
- continueAbility();
- } catch (IllegalStateException | UnsupportedOperationException e) {
- LogUtil.error(TAG, "startContinue Exception ");
- }
- }
8.Slice中實現(xiàn)一下幾個方法,返回true
- @Override
- public boolean onStartContinuation() {
- return true;
- }
- @Override
- public boolean onSaveData(IntentParams intentParams) {
- //設(shè)置設(shè)備遷移后需要恢復(fù)的數(shù)據(jù)
- intentParams.setParam(CONTINUE_PARAM_KEY_INPUT, inputNum);
- return true;
- }
- @Override
- public boolean onRestoreData(IntentParams intentParams) {
- //恢復(fù)數(shù)據(jù)
- Object object = intentParams.getParam(CONTINUE_PARAM_KEY_INPUT);
- if (object instanceof Long) {
- inputNum = (long) object;
- }
- return true;
- }
- @Override
- public void onCompleteContinuation(int i) {
- //設(shè)備遷移完成,關(guān)閉Slice
- terminate();
- }
問題總結(jié)
1.Slice中獲取bundleName:getBundleName()
2.Slice中獲取Ability:getAbility()
3.如果想監(jiān)聽Ability/Slice的生命周期變化,可以實現(xiàn)LifecycleStateObserver接口,實現(xiàn)onStateChanged方法
- public class FirstAbilitySlice extends AbilitySlice implements LifecycleStateObserver{
- ...
- }
- @Override
- public void onStateChanged(Lifecycle.Event event, Intent intent) {
- lifecycleState.setText(lifecycleState.getText() + System.lineSeparator() + event.name());
- }
4.Slice中啟動另外一個Ability的方法也可以用setElement
- private void startSecondAbility() {
- Intent intent = new Intent();
- intent.setElement(new ElementName("", getBundleName(), SecondAbility.class.getName()));
- intent.setParam(Const.MESSAGE_KEY_SQUARED, inputNum);
- startAbilityForResult(intent, REQUEST_CODE_TO_ABILITY_B);
- }
5.Slice中在onAbilityResult方法中處理其它Abilty返回的結(jié)果
- /**
- *
- * @param requestCode 發(fā)出的請求碼,用來識別是自己的請求
- * @param resultCode 收到的結(jié)果碼,用來校驗對端的結(jié)果
- * @param resultData 返回的數(shù)據(jù)
- */
- @Override
- protected void onAbilityResult(int requestCode, int resultCode, Intent resultData) {
- //使用switch邏輯語句判斷
- switch (requestCode) {
- //是自己發(fā)出去的請求碼
- case REQUEST_CODE_TO_ABILITY_B:
- //是雙方約定的結(jié)果碼
- if (resultCode == Const.RESULT_CODE_FROM_ABILITY_B) {
- //根據(jù)key獲取指定類型的參數(shù)
- long outputNum = resultData.getLongParam(Const.MESSAGE_KEY_SQUARED, 0);
- numberText.setText(String.valueOf(outputNum));
- }
- break;
- default:
- break;
- }
- }
文章相關(guān)附件可以點擊下面的原文鏈接前往下載
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)