2020征文-手機【干貨】鴻蒙應用程序流轉的實現!
https://harmonyos.51cto.com/#zz
大家好!!歡迎您來到51CTO鴻蒙專區。我是董昱。很榮幸成為HarmonyOS系統課程開發者。

這里我給大家介紹一下HarmonyOS應用程序流轉的實現。
本文中的內容有視頻版哦。在我在51CTO中首發了我的最新免費的視頻教程《精講鴻蒙應用程序開發》就有相關的內容。
歡迎大家觀看,并提出寶貴的意見:https://edu.51cto.com/course/26138.html
下面進入正題:
1 什么是應用程序的協同和流轉?
首先,什么是應用程序的流轉和協同呢?
應用流轉和協同是鴻蒙操作系統分布式的重要體現。這里面涉及兩個概念:
- 協同:在多個設備上同時運行同一個應用程序。用戶在多個設備的支持下進行同一工作任務。
- 流轉:一個應用程序在某一個設備上運行時,因用戶需要切換到到另外一個上繼續運行,同時在原來的設備上停止運行。流轉包括遷移(Migrate)和遷回兩個層面。
如果文字上讀起來困難的話,可以看看下面的例子:
如果我正在用設備A寫郵件,但是設備A快沒電了,我就可以將這個界面從設備A流轉到設備B上,此時界面中我已經輸入的郵件信息都沒有丟失和變化。這個過程稱為流轉:
流轉包括了遷移和遷回兩個層面。
這個特性有點類似于蘋果的應用接力,已經不是非常新鮮的事情了。但是鴻蒙的分布式特性還是存在兩點特別的優勢:
(1)蘋果的應用接力開發非常繁瑣。鴻蒙的流轉卻非常簡單,易學。
(2)蘋果設備的接力難以實現協同功能。
那么什么是協同呢?
例如,我用手機看新聞列表,用智慧屏瀏覽新聞。而手機上和智慧屏上都運行著同樣一個應用程序,如下圖所示。
這里要注意是同一個應用程序。這個協同過程借助于分布式軟總線等關鍵技術是如絲般順滑的,而且開發上非常簡單。
在這里,先給大家演示以下流轉的基本開發方法。
2 應用程序流轉的實現
這主要包含了三個主要步驟:
(1)權限配置(包括動態權限和靜態權限)
(2)在Ability和AbilitySlice中實現IAbilityContinuation接口。
(3)調用ContinueAbility()方法實現流轉
具體的實現方法如下:
首先,我們創建一個空的手機Java工程。模板為:Empty Feature Ability (Java)。
讓我們修改以下UI界面,僅顯示一個【流轉】按鈕。如圖
布局代碼如下:
- <?xml version="1.0" encoding="utf-8"?>
- <DirectionalLayout
- xmlns:ohos="http://schemas.huawei.com/res/ohos"
- ohos:height="match_parent"
- ohos:width="match_parent"
- ohos:orientation="vertical">
- <Button
- ohos:id="$+id:btn_continue"
- ohos:height="match_parent"
- ohos:width="match_parent"
- ohos:layout_alignment="horizontal_center"
- ohos:text="遷移"
- ohos:text_size="50"
- />
- </DirectionalLayout>
然后在config.json中配置靜態權限。
代碼如下:
- {
- ......
- "module": {
- ......
- "reqPermissions": [
- {
- "name": "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"
- },
- {
- "name": "ohos.permission.DISTRIBUTED_DATASYNC"
- }
- ],
- .....
- }
在MainAbility.java中添加以下代碼:
- public class MainAbility extends Ability implements IAbilityContinuation {
- @Override
- public void onStart(Intent intent) {
- super.onStart(intent);
- super.setMainRoute(MainAbilitySlice.class.getName());
- requestPermission();
- }
- private void requestPermission() {
- String[] permission = {
- "ohos.permission.DISTRIBUTED_DATASYNC",
- "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"};
- List<String> applyPermissions = new ArrayList<>();
- for (String element : permission) {
- if (verifySelfPermission(element) != 0) {
- if (canRequestPermission(element)) {
- applyPermissions.add(element);
- } else {
- }
- } else {
- }
- }
- requestPermissionsFromUser(applyPermissions.toArray(new String[0]), 0);
- }
- @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) {
- }
- }
這段代碼中包括兩個部分:
(1)通過requestPermission()方法動態申請權限。
(2)實現IAbilityContinuation接口,并重寫其四個主要的方法。方法內容可以為空,因為承載界面的為AbilitySlice。
在MainAbilitySlice.java中添加以下代碼:
- public class MainAbilitySlice extends AbilitySlice implements IAbilityContinuation { @Override
- public void onStart(Intent intent) {
- super.onStart(intent);
- super.setUIContent(ResourceTable.Layout_ability_main);
- Button btnContinue = (Button) findComponentById(ResourceTable.Id_btn_continue);
- btnContinue.setClickedListener(new Component.ClickedListener() {
- @Override
- public void onClick(Component component) {
- continueAbility(getAvailableDeviceIds().get(0));
- }
- });
- }
- @Override
- public void onActive() {
- super.onActive();
- }
- @Override
- public void onForeground(Intent intent) {
- super.onForeground(intent);
- }
- @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();
- }
- /**
- * 獲得所有已經連接的所有設備ID
- * @return 設備ID列表
- */
- public static List<String> getAvailableDeviceIds() {
- // 獲得DeviceInfo列表,包含了已經連接的所有設備信息
- List<DeviceInfo> deviceInfoList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
- // 如果DeviceInfo列表為空則返回
- if (deviceInfoList == null || deviceInfoList.size() == 0) {
- return null;
- }
- // 遍歷DeviceInfo列表,獲得所有的設備ID
- List<String> deviceIds = new ArrayList<>();
- for (DeviceInfo deviceInfo : deviceInfoList) {
- deviceIds.add(deviceInfo.getDeviceId());
- }
- // 返回所有的設備ID
- return deviceIds;
- }
- }
這個代碼中包括以下幾個方面:
(1)通過getAvailableDeviceIds()獲取周圍可以流轉應用程序的設備ID列表。
(2)通過continueAbility()方法進行設備流轉
(3)在onSaveData()和onRestoreData()方法中可以將界面中的數據流轉出去。數據的流轉大家可以觀看我的視頻教程哦,里面有詳細的敘述:https://edu.51cto.com/course/26138.html?hm(在第5章的第1講)
(4)在onCompleteContinuation()方法中調用termiateAbility()方法結束原先設備上的應用程序。
最后,在兩個搭載鴻蒙操作系統的手機上均安裝這個程序,并在其中一個設備上打開的該應用程序:單擊【Continue】按鈕就可以實現應用程序在兩個設備間的流轉了。
具體的演示大家可以觀看的視頻教程哦(在第5章的第1講)!免費噠!
https://edu.51cto.com/course/26138.html?hm

不過,這兩個設備需要在同一個WiFi下,并且登錄同一個華為賬號,才可以使用分布式軟總線實現流轉。
©著作權歸作者和HarmonyOS技術社區共同所有,如需轉載,請注明出處,否則將追究法律責任
https://harmonyos.51cto.com/#zz






















