鸿蒙(HMOS)开发基础篇(二)开发初体验-多设备协同

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)

今天,我是数据库的BOS(读者-写者问题)

哲学家不会吃饭了,我们快来帮帮他们(C语言、进程通信)

Python+OpenCV+imutils的简单图片处理(放缩、翻转、旋转、灰度RGB提取)

python手写K-means实现二维聚类.


如果文中有误,还请在评论区指正。这里是海小皮,我们一同进步!!!

Guess you like

Origin blog.csdn.net/weixin_42464904/article/details/121315032