赞
踩
同一应用一次开发,多端部署
可在不同设备间迁移,并完成自适应布局
鸿蒙应用的结构层次如下图所示
分布式任务调度
支持跨设备远程访问启动、远程调用、远程连接、迁移等操作,选择合适的设备完成分布式任务
应用结构:
鸿蒙应用以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中声明
等待Gradle加载
使用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
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(); } }
在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(); }
按照上一节讲到的,启动远程模拟器
编译
运行
编译完成无错误后,分别选择两个备运行entry
结果演示
鸿蒙开发体验-应用迁移
鸿蒙(HMOS)开发基础篇(一)环境搭建 & Helloworld)
Python+OpenCV+imutils的简单图片处理(放缩、翻转、旋转、灰度RGB提取)
如果文中有误,还请在评论区指正。这里是海小皮,我们一同进步!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。