2020征文-手機(jī)【干貨】鴻蒙應(yīng)用程序流轉(zhuǎn)的實(shí)現(xiàn)!
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz
大家好!!歡迎您來到51CTO鴻蒙專區(qū)。我是董昱。很榮幸成為HarmonyOS系統(tǒng)課程開發(fā)者。

這里我給大家介紹一下HarmonyOS應(yīng)用程序流轉(zhuǎn)的實(shí)現(xiàn)。
本文中的內(nèi)容有視頻版哦。在我在51CTO中首發(fā)了我的最新免費(fèi)的視頻教程《精講鴻蒙應(yīng)用程序開發(fā)》就有相關(guān)的內(nèi)容。
歡迎大家觀看,并提出寶貴的意見:https://edu.51cto.com/course/26138.html
下面進(jìn)入正題:
1 什么是應(yīng)用程序的協(xié)同和流轉(zhuǎn)?
首先,什么是應(yīng)用程序的流轉(zhuǎn)和協(xié)同呢?
應(yīng)用流轉(zhuǎn)和協(xié)同是鴻蒙操作系統(tǒng)分布式的重要體現(xiàn)。這里面涉及兩個(gè)概念:
- 協(xié)同:在多個(gè)設(shè)備上同時(shí)運(yùn)行同一個(gè)應(yīng)用程序。用戶在多個(gè)設(shè)備的支持下進(jìn)行同一工作任務(wù)。
- 流轉(zhuǎn):一個(gè)應(yīng)用程序在某一個(gè)設(shè)備上運(yùn)行時(shí),因用戶需要切換到到另外一個(gè)上繼續(xù)運(yùn)行,同時(shí)在原來的設(shè)備上停止運(yùn)行。流轉(zhuǎn)包括遷移(Migrate)和遷回兩個(gè)層面。
如果文字上讀起來困難的話,可以看看下面的例子:
如果我正在用設(shè)備A寫郵件,但是設(shè)備A快沒電了,我就可以將這個(gè)界面從設(shè)備A流轉(zhuǎn)到設(shè)備B上,此時(shí)界面中我已經(jīng)輸入的郵件信息都沒有丟失和變化。這個(gè)過程稱為流轉(zhuǎn):
流轉(zhuǎn)包括了遷移和遷回兩個(gè)層面。
這個(gè)特性有點(diǎn)類似于蘋果的應(yīng)用接力,已經(jīng)不是非常新鮮的事情了。但是鴻蒙的分布式特性還是存在兩點(diǎn)特別的優(yōu)勢(shì):
(1)蘋果的應(yīng)用接力開發(fā)非常繁瑣。鴻蒙的流轉(zhuǎn)卻非常簡單,易學(xué)。
(2)蘋果設(shè)備的接力難以實(shí)現(xiàn)協(xié)同功能。
那么什么是協(xié)同呢?
例如,我用手機(jī)看新聞列表,用智慧屏瀏覽新聞。而手機(jī)上和智慧屏上都運(yùn)行著同樣一個(gè)應(yīng)用程序,如下圖所示。
這里要注意是同一個(gè)應(yīng)用程序。這個(gè)協(xié)同過程借助于分布式軟總線等關(guān)鍵技術(shù)是如絲般順滑的,而且開發(fā)上非常簡單。
在這里,先給大家演示以下流轉(zhuǎn)的基本開發(fā)方法。
2 應(yīng)用程序流轉(zhuǎn)的實(shí)現(xiàn)
這主要包含了三個(gè)主要步驟:
(1)權(quán)限配置(包括動(dòng)態(tài)權(quán)限和靜態(tài)權(quán)限)
(2)在Ability和AbilitySlice中實(shí)現(xiàn)IAbilityContinuation接口。
(3)調(diào)用ContinueAbility()方法實(shí)現(xiàn)流轉(zhuǎn)
具體的實(shí)現(xiàn)方法如下:
首先,我們創(chuàng)建一個(gè)空的手機(jī)Java工程。模板為:Empty Feature Ability (Java)。
讓我們修改以下UI界面,僅顯示一個(gè)【流轉(zhuǎn)】按鈕。如圖
布局代碼如下:
- <?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中配置靜態(tài)權(quán)限。
代碼如下:
- {
- ......
- "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) {
- }
- }
這段代碼中包括兩個(gè)部分:
(1)通過requestPermission()方法動(dòng)態(tài)申請(qǐng)權(quán)限。
(2)實(shí)現(xiàn)IAbilityContinuation接口,并重寫其四個(gè)主要的方法。方法內(nèi)容可以為空,因?yàn)槌休d界面的為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();
- }
- /**
- * 獲得所有已經(jīng)連接的所有設(shè)備ID
- * @return 設(shè)備ID列表
- */
- public static List<String> getAvailableDeviceIds() {
- // 獲得DeviceInfo列表,包含了已經(jīng)連接的所有設(shè)備信息
- List<DeviceInfo> deviceInfoList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
- // 如果DeviceInfo列表為空則返回
- if (deviceInfoList == null || deviceInfoList.size() == 0) {
- return null;
- }
- // 遍歷DeviceInfo列表,獲得所有的設(shè)備ID
- List<String> deviceIds = new ArrayList<>();
- for (DeviceInfo deviceInfo : deviceInfoList) {
- deviceIds.add(deviceInfo.getDeviceId());
- }
- // 返回所有的設(shè)備ID
- return deviceIds;
- }
- }
這個(gè)代碼中包括以下幾個(gè)方面:
(1)通過getAvailableDeviceIds()獲取周圍可以流轉(zhuǎn)應(yīng)用程序的設(shè)備ID列表。
(2)通過continueAbility()方法進(jìn)行設(shè)備流轉(zhuǎn)
(3)在onSaveData()和onRestoreData()方法中可以將界面中的數(shù)據(jù)流轉(zhuǎn)出去。數(shù)據(jù)的流轉(zhuǎn)大家可以觀看我的視頻教程哦,里面有詳細(xì)的敘述:https://edu.51cto.com/course/26138.html?hm(在第5章的第1講)
(4)在onCompleteContinuation()方法中調(diào)用termiateAbility()方法結(jié)束原先設(shè)備上的應(yīng)用程序。
最后,在兩個(gè)搭載鴻蒙操作系統(tǒng)的手機(jī)上均安裝這個(gè)程序,并在其中一個(gè)設(shè)備上打開的該應(yīng)用程序:單擊【Continue】按鈕就可以實(shí)現(xiàn)應(yīng)用程序在兩個(gè)設(shè)備間的流轉(zhuǎn)了。
具體的演示大家可以觀看的視頻教程哦(在第5章的第1講)!免費(fèi)噠!
https://edu.51cto.com/course/26138.html?hm

不過,這兩個(gè)設(shè)備需要在同一個(gè)WiFi下,并且登錄同一個(gè)華為賬號(hào),才可以使用分布式軟總線實(shí)現(xiàn)流轉(zhuǎn)。
©著作權(quán)歸作者和HarmonyOS技術(shù)社區(qū)共同所有,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz