基于跨設備遷移和分布式文件能力的DistributedMail解析
一、DistributedMail演示效果
(一)項目效果展示
(二)提示在多設備調試過程中的注意
想要多設備調試務必在Tools下面選擇Super device。如果選擇單個設備并進行分布式操作就會出現:
選擇完多設備后,務必分別在兩個設備部署應用。如果只部署了一臺也是不行的。
(三)解決頁面顯示的問題
需要注意的是,因為原文件布局的原因,遷移到其他設備的頁面布局出現了問題,在遠程模擬器上呈現的就是遷移到其他設備的頁面的確定按鈕看不見。這最開始屬實把我給整懵了。
如下:
百二秦關終屬楚!!!!找了半天終于弄明白了并解決。
手機快捷控制欄把按鈕遮蓋了
1.分析問題:
- 要么是dialog_layout_device.xml布局出現了問題,把下面的組件擠出去了;
- 要么是DeviceSelectDialog.class中創建的ListDialog的設置出現了問題;
- 要么是手機快捷控制欄把按鈕遮蓋了。
2.調整dialog_layout_device.xml布局,發現此布局為方向布局,按權重分配高度,其中ListContainer的ohos:weight=“1”,故刪去此行并把高度設為150vp(總共300vp,遷移到其他設備的Text50vp,最后的水平方向容器)(確定、占位、取消三個組件)共占100vp)其結果如下圖:

3.確定是ListDialog彈窗的問題就返回DeviceSelectDialog.class中去分析
(1)分析大致結構(這里就不具現化了,后面會對整個工程進行剖析)
(2)控制變量進行調試,發現把彈窗放在屏幕中間,取消和確定按鈕可以出現。
最終確定是手機快捷控制欄把按鈕遮蓋了,最終解決方案,為了保證ListContainer可以很好的展示出可遷移設備且彈窗看起來更大氣一點,dialog_layout_device.xml只把總體方向布局的高度變為ohos:height=“400vp”,把對齊方式改為居中。setAlignment(LayoutAlignment.CENTER);
如果還是想把彈窗弄在下面,且可以顯示取消和確定按鈕,就把setAlignment(LayoutAlignment.BOTTOM);布局文中下方留出100多的vp給手機快捷控制欄就行。(具體操作把ListContainer的ohos:weight="1"刪去,對整體布局的高度進行具象化,即不按比例按數值)
最終效果:
二、工程目錄分析
三、權限申請
很明顯的,在此應用部署后,有兩個權限彈框彈出。
- 第一個是訪問圖片和媒體的權限
- 第二個是使用多設備協同的的權限
但其實本應用申請了六個權限:
在MainAbility中的onStart()函數中:

<a name=“permission”></a>大家有沒有想過這樣一個問題:為什么這里permission里就三個權限,其他三個權限呢,為什么這里有三個權限,工程演示的時候卻是有兩個確定彈框呢。其原因:
敏感權限的申請需要按照動態申請流程向用戶申請授權。非敏感權限不涉及用戶的敏感數據或危險操作,僅需在config.json中聲明,應用安裝后即被授權。另外三個是非敏感權限。
應用動態申請權限而應用最開始只請求了兩個權限。另外一個修改本地圖片和媒體的權限并沒有開始申請僅此而已。
- //訪問圖片和媒體
- "ohos.permission.READ_USER_STORAGE",
- //允許不同設備間的數據交換。
- "ohos.permission.DISTRIBUTED_DATASYNC"
對于權限的申請有代碼示例工程(Permission),之后會對權限進行更全面的學習并對工程進行更全面的剖析。
獲取分布式設備即MailEditSlice中setClickAction方法
四、界面分析(重點layout的梳理)
1.在界面分析的時候,發現layout的xml文件標紅,發現代碼示例工程為SDKversion2.0所以出現了問題。下面是一個例子其他的不列全。<a name=“version”></a>
2.且未用string.json保存字符串<a name=“string”></a>
3.對moudle_mail_edit.xml進行布局分析其他幾個Layout組件很少就不贅述了。
五、頁面梳理(slice的梳理)
1.打開MailEditSlice,發現不規范的地方,關于final的添加。
2.對其分析(關于頁面跨設備遷移看我前一篇文章PageAbility全面解析有詳解)
六、郵件正文數據、郵件初始化、郵件數據處理
- bean/MailDataBean.java,用于表示郵件正文數據
- MailDataBean.java中對郵件數據進行封裝,對Param頁面間傳遞的信息進行處理
- MailEditSlice頁面中,我們把郵件內容初始化即上面slice中fillview部分
- onSaveData()和onRestoreData()方法來進行傳遞和恢復
預處理:
七、問題總結
1.(未解決)怎么使得彈窗不被手機快捷欄遮擋,就像官方文檔給的圖一樣。
2.(已解決)本應用申請了六個權限,但MainAbility中requestPermission()只有三個,而且項目演示中,最開始只有兩個權限申請彈窗。筆者已解決在文中權限申請部分。
3.(已解決)因為版本原因(代碼示例工程為SDKversion2.0所以出現了問題),
4.(已解決)且未用string.json保存字符串