开发初体验-多设备协同
1 鸿蒙应用基础知识
1.1 应用简介
同一应用一次开发,多端部署
可在不同设备间迁移,并完成自适应布局
鸿蒙应用的结构层次如下图所示
分布式任务调度
支持跨设备远程访问启动、远程调用、远程连接、迁移等操作,选择合适的设备完成分布式任务
1.2 编写鸿蒙应用
应用结构:
鸿蒙应用以APP pack形式发布,由多个hap包及描述hap包的info组成
hap:ability的部署包,鸿蒙系统围绕ability组件代码展开,hap分为Entry和Future
Entry为应用主模块,一个APP只有一个Entry,对于一个设备类型必须有且只有一个Entry类型的hap可独立安装运行
Future为应用的动态特性模块,一个APP可以包含一个或者多个,也可以不包含,只有包含ability的hap才能独立运行
hap组成:代码、资源、第三方库、应用配置文件
开发步骤:
UI布局
布局类组件:
单一位置排列 相对位置排列 确切位置排列 重叠位置排列 自适应框布局
显示类组件:
单纯的显示文本、图像、时钟、进度条
交互类组件:
具体应用场景下和用户交互响应的功能,button点击、slider量值选择
创建UI布局的方式:
在代码中创建、在XML中声明
2 多设备协同应用开发
2.1 创建应用项目
等待Gradle加载
2.2 设计用户界面
使用XML声明布局
找到layout
编写ability_mian.xml的XML文件
<?xml version="1.0" encoding="utf-8"?>
<!--图库部分-->
<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:id="$+id:gallery_root"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical">
<!--图库:标题栏-->
<DirectionalLayout
ohos:height="match_content"
ohos:width="match_content"
ohos:orientation="horizontal">
<Text
ohos:height="match_content"
ohos:width="match_content"
ohos:top_margin="20px"
ohos:left_margin="50vp"
ohos:text="$string:应用迁移"
ohos:text_color="#55AAFF"
ohos:text_size="80px"/>
<Image
ohos:id="$+id:gallery_sync"
ohos:height="match_content"
ohos:width="match_content"
ohos:top_margin="20px"
ohos:left_margin="7vp"
ohos:image_src="$media:ic_sync"/>
<Image
ohos:id="$+id:gallery_more"
ohos:height="match_content"
ohos:width="match_content"
ohos:top_margin="20px"
ohos:left_margin="7vp"
ohos:image_src="$media:ic_more"/>
</DirectionalLayout>
<!--图库:分栏-->
<AdaptiveBoxLayout
ohos:height="match_content"
ohos:width="match_content"
ohos:top_margin="5px">
<DirectionalLayout
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical"
ohos:margin="20vp">
<Image
ohos:id="$+id:hxp"
ohos:height="match_content"
ohos:width="match_content"
ohos:image_src="$media:ic_hxp"/>
</DirectionalLayout>
<DirectionalLayout
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical"
ohos:margin="20vp">
<Image
ohos:id="$+id:bilibili"
ohos:height="match_content"
ohos:width="match_content"
ohos:image_src="$media:ic_bilibili"/>
</DirectionalLayout>
</AdaptiveBoxLayout>
</DirectionalLayout>
将UI布局中用到的resources放到对应的文件夹下
resources目录分两大类:basis、rawfile
resources目录按照两级目录的形式组织,目录命名需要符合规范,以便根据设备形态去匹配相应目录下的资源文件
basis目录默认存在,当相应的resources资源目录中没与设备形态匹配的限定子目录时,自动引用该目录中的资源文件,二级目录存放字符串、媒体、动画等
将使用到的字符串进行声明:
定义英文模式
定义中文模式
在MainAbility.Java中加载layout
2.3 实现应用功能
2.3.1 权限申请
HMOS所有的应用均在应用沙盒中运行,应用对资源的访问权限由系统负责管理,默认情况应用访问有限的系统资源
应用权限会受到ability、应用、用户、系统等多方面共同管理,保证受限接口在约定好的情况下正常使用,避免接口滥用导致应用、用户、设备受损
声明权限
在config.json中进行权限声明
在module的底部声明权限
请求权限权限
在MainAbility.Java中引入相关的库
import ohos.bundle.IBundleManager;
import ohos.security.SystemPermission;
在此文件的public class MainAbility extends Ability中编写权限请求代码
/**
* 应用迁移
*/
private void migrateAbility() {
if(verifySelfPermission(SystemPermission.DISTRIBUTED_DATASYNC)== IBundleManager.PERMISSION_GRANTED) {
this.continueAbility();
}
else {
requestPermission(SystemPermission.DISTRIBUTED_DATASYNC);
}
}
/**
* 主动向用户发起权限申请
*
* @param permission description
*/
private void requestPermission(String permission){
if(canRequestPermission(permission)){
requestPermissionsFromUser(new String[] {
permission}, 0x1001);
}
}
/**
* 用户完成授权申请后继续执行迁移任务
*
* @param requestCode description
* @param permissions description
* @param grantResults description
*/
@Override
public void onRequestPermissionsFromUserResult(int requestCode,String[] permissions,int[] grantResults){
if(permissions == null || permissions.length ==0 ||grantResults == null ||grantResults.length == 0){
return;
}
if(requestCode == 0x1001 && grantResults[0] == IBundleManager.PERMISSION_GRANTED){
this.continueAbility();
}
}
2.3.2 实现应用迁移
在HMOS中分布式任务调度平台对搭载了HMOS的多设备构筑的超级虚拟终端提供了统一的组件管理能力,支持远程启动、远程调用业务无缝迁移等分布式任务,通过如下调用方式即可实现设备间无缝迁移
绑定、响应用户事件
事件主要包括手势事件和按键事件
手势事件一般在移动设备中使用
按键事件一般在智慧屏中使用
引入使用到的库
import ohos.agp.components.Component;
import ohos.agp.components.Image;
import ohos.multimodalinput.event.KeyEvent;
import ohos.aafwk.content.IntentParams;
import ohos.aafwk.ability.IAbilityContinuation;
在public void onStart(Intent intent)中将用户事件与按钮绑定顺便进行图片显示自适应
//为UI中的远程迁移按钮绑定触发迁移的触发事件
Image syncButton = (Image) findComponentById(ResourceTable.Id_gallery_sync);
syncButton.setClickedListener(this::onClick);
syncButton.setKeyEventListener(this::onKeyEvent);
//图片大小自适应
Image test0 = (Image) findComponentById(ResourceTable.Id_hxp);
test0.setScaleMode(Image.ScaleMode.ZOOM_CENTER);
Image test1 = (Image) findComponentById(ResourceTable.Id_bilibili);
test1.setScaleMode(Image.ScaleMode.ZOOM_CENTER);
在public class MainAbility extends Ability后面加上
implements IAbilityContinuation,Component.ClickedListener,Component.KeyEventListener
并编写事件响应函数
//绑定用户响应
public class PhoneClick implements Component.ClickedListener {
@Override
public void onClick(Component component)
{
continueAbility();
}
}
public class TVClick implements Component.KeyEventListener {
@Override
public boolean onKeyEvent(Component component, KeyEvent keyEvent)
{
if(keyEvent.isKeyDown() && keyEvent.getKeyCode() == keyEvent.KEY_DPAD_CENTER)
continueAbility();
return true;
}
}
编写迁移前后的服务函数
@Override
public boolean onStartContinuation(){
//用于发起应用迁移侧完成迁移前的准备工作
return true;
}
@Override
public boolean onSaveData(IntentParams params){
//用于发起应用迁移侧保存迁移所需要的数据
return true;
}
@Override
public boolean onRestoreData(IntentParams params){
//用于迁移侧应用恢复数据
return true;
}
@Override
public void onCompleteContinuation(int code){
//用于发起应用迁移侧迁移完成后的一些动作
this.terminateAbility();
}
3 编译与运行
按照上一节讲到的,启动远程模拟器
编译
运行
编译完成无错误后,分别选择两个备运行entry
结果演示
鸿蒙开发体验-应用迁移
X 往期文章
鸿蒙(HMOS)开发基础篇(一)环境搭建 & Helloworld)
Python+OpenCV+imutils的简单图片处理(放缩、翻转、旋转、灰度RGB提取)
如果文中有误,还请在评论区指正。这里是海小皮,我们一同进步!!!