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

這里我給大家介紹一下HarmonyOS應(yīng)用程序流轉(zhuǎn)的實(shí)現(xiàn)。
本文中的內(nèi)容有視頻版哦。在我在51CTO中首發(fā)了我的最新免費(fèi)的視頻教程《精講鴻蒙應(yīng)用程序開(kāi)發(fā)》就有相關(guān)的內(nèi)容。
歡迎大家觀看,并提出寶貴的意見(jiàn):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í)在原來(lái)的設(shè)備上停止運(yùn)行。流轉(zhuǎn)包括遷移(Migrate)和遷回兩個(gè)層面。
 
如果文字上讀起來(lái)困難的話,可以看看下面的例子:
如果我正在用設(shè)備A寫(xiě)郵件,但是設(shè)備A快沒(méi)電了,我就可以將這個(gè)界面從設(shè)備A流轉(zhuǎn)到設(shè)備B上,此時(shí)界面中我已經(jīng)輸入的郵件信息都沒(méi)有丟失和變化。這個(gè)過(guò)程稱為流轉(zhuǎn):
流轉(zhuǎn)包括了遷移和遷回兩個(gè)層面。
這個(gè)特性有點(diǎn)類似于蘋(píng)果的應(yīng)用接力,已經(jīng)不是非常新鮮的事情了。但是鴻蒙的分布式特性還是存在兩點(diǎn)特別的優(yōu)勢(shì):
(1)蘋(píng)果的應(yīng)用接力開(kāi)發(fā)非常繁瑣。鴻蒙的流轉(zhuǎn)卻非常簡(jiǎn)單,易學(xué)。
(2)蘋(píng)果設(shè)備的接力難以實(shí)現(xiàn)協(xié)同功能。
那么什么是協(xié)同呢?
例如,我用手機(jī)看新聞列表,用智慧屏瀏覽新聞。而手機(jī)上和智慧屏上都運(yùn)行著同樣一個(gè)應(yīng)用程序,如下圖所示。
這里要注意是同一個(gè)應(yīng)用程序。這個(gè)協(xié)同過(guò)程借助于分布式軟總線等關(guān)鍵技術(shù)是如絲般順滑的,而且開(kāi)發(fā)上非常簡(jiǎn)單。
在這里,先給大家演示以下流轉(zhuǎn)的基本開(kāi)發(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)通過(guò)requestPermission()方法動(dòng)態(tài)申請(qǐng)權(quán)限。
(2)實(shí)現(xiàn)IAbilityContinuation接口,并重寫(xiě)其四個(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)通過(guò)getAvailableDeviceIds()獲取周圍可以流轉(zhuǎn)應(yīng)用程序的設(shè)備ID列表。
(2)通過(guò)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è)備上打開(kāi)的該應(yīng)用程序:?jiǎn)螕簟綜ontinue】按鈕就可以實(shí)現(xiàn)應(yīng)用程序在兩個(gè)設(shè)備間的流轉(zhuǎn)了。
具體的演示大家可以觀看的視頻教程哦(在第5章的第1講)!免費(fèi)噠!
https://edu.51cto.com/course/26138.html?hm

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



















 
 
 
 
 
 
 