精华内容
下载资源
问答
  • 鸿蒙HarmonyOS应用开发初体验

    万次阅读 多人点赞 2021-04-18 23:50:29
    近期(4.12 ~ 4.25)鸿蒙OS正在举行开发者日活动,趁机参加并了解一下鸿蒙OS的现状和应用开发体验。 1. 开发环境搭建 下载安装IDE(当前版本2.1 Beta3) 华为为Harmony应用开发提供了配套的IDE:DevEco Studio...

    image.png
    https://developer.huawei.com/consumer/cn/forum/communityHome

    近期(4.12 ~ 4.25)鸿蒙OS正在举行开发者日活动,趁机参加并了解一下鸿蒙OS的现状和当前的应用开发体验。


    1. 开发环境搭建


    下载安装IDE(当前版本:2.1 Beta3)

    华为为Harmony应用开发提供了配套的IDE:DevEco Studio(内心比较排斥这种带Eco字眼儿的命名,PPT怎么吹无所谓,开发工具咱能不能务实一点儿?)

    下载IDE需要登录Huawei账号,我安装的是Mac版,下载后的安装过程还是比较顺畅的

    image.png

    启动界面显示DevEco Studio仍然是基于IntelliJ的定制IDE

    下载SDK

    跟Android一样,IDE启动第一件事情是下载Harmony SDK

    image.png

    每个版本的SDK中都提供了三套API用来开发Java、Js、C++代码,版本上需要保持一致。
    不同的华为设备对SDK版本有不同要求,比如在测试中发现,我的API4的代码无法运行在P40上,改为API5就OK了

    关于SDK源码

    需要注意,目前无法通过SDKManager打包下载源码,源码需要通过gitee单独下载

    https://gitee.com/openharmony

    这为代码调试带来障碍,不知道后期是否可以像Andoird那样与SDK一起打包下载源码

    创建项目

    Harmony主打多端协同,所以很重视设备多样性,可面向不同设备创建模板项目

    Screen Shot 2021-04-18 at 10.28.09 AM.png

    相比AndroidStudio,Harmony提供了更加丰富的项目模板,模板中除了UI以外还提供了部分数据层代码,基本上是一个可以二次开发的APP。

    Screen Shot 2021-04-18 at 5.48.55 PM.png


    2. 鸿蒙项目结构


    IDE界面

    试着创建了一个News Feature Ability(新闻流)的模板项目,成功在IDE中打开:

    image.png

    IDE窗口与AndroidStudio类似,值得一提的Harmony右边提供的Preview窗口,可以对xml或者Ablitiy文件进行预览,有点Compose的Preview的感觉,但是只能静态预览,无法交互

    工程文件

    image.png

    工程文件和Android类似,甚至可以找到一一对应的关系

    HarmonyAndroid说明
    entryapp默认启动模块(主模块),相当于app_module
    MyApplicationXXXApplication鸿蒙的MyApplication是AbilityPackage的子类
    MainAbilityMainActivity入口页。鸿蒙中将四大组件的概念统一成Ability
    MainAbilityListSliceXXXFragmentSlice类似Fragment,UI的基本组成单元
    ComponentViewComponent类相当于View,后文介绍
    config.jsonAndroidManifest.xml鸿蒙使用json替代xml进行Manifest配置,配置项目差不多
    resources/base/…res/…包括Layout文件在内的各种资源文件依旧使用xml
    resources/rawfile/assets/rawfile存储任意格式原始资源,相当于assets
    build.gradlebuild.gradle编译脚本,两者一样
    build/outpus/…/*.hapbuild/outputs/…/*.apk鸿蒙的产物是hap(harmony application package)
    解压后里面有一个同名的.apk文件,
    这后续是因为鸿蒙需要同时支持apk安装的兼容方案

    Ability

    Ability是应用所具备能力的抽象,Harmony支持应用以Ability为单位进行部署。一个应用由一个或多个FA(Feature Ability)或PA(Particle Ability)组成。FA有UI界面,提供与用户交互的能力;而PA无UI界面,提供后台运行任务的能力以及统一的数据访问抽象

    • FA支持Page Ability:
      • Page Ability用于提供与用户交互的能力。一个Page可以由一个或多个AbilitySlice构成,AbilitySlice之间可以进行页面导航

    image.png

    • PA支持Service Ability和Data Ability:
      • Service Ability:用于提供后台运行任务的能力。
      • Data Ability:用于对外部提供统一的数据访问抽象。

    可以感觉到,各种Ability可以对照Android的四大组件来理解

    HarmonyAndroid
    Page Ability (FA)Activity
    Service Ability (PA)Service
    Data Ability(PA)ContentProvider
    AbilitySliceFragment

    代码一览

    MainAbility

    以预置的News Feature Ability为例子,这是一个拥有两个Slice的Page Ability,通过Router注册两个Slice

    public class MainAbility extends Ability {
    
        @Override
        public void onStart(Intent intent) {
            super.onStart(intent);
            super.setMainRoute(MainAbilityListSlice.class.getName()); //添加路由:ListSlice
            addActionRoute("action.detail", MainAbilityDetailSlice.class.getName());//DetailSlice
    
            ...
        }
    }
    

    以下是在模拟器中运行两个Slice的页面效果

    MainAbilityListSliceMainAbilityDetailSlice
    image.pngimage.png

    MainAbilityListSlice

    主要看一下列表的显示逻辑

    public class MainAbilityListSlice extends AbilitySlice {
    
        ...
        
        @Override
        public void onStart(Intent intent) {
            super.onStart(intent);
            super.setUIContent(ResourceTable.Layout_news_list_layout);
            initView();
            initData(); //加载数据
            initListener();
            newsListContainer.setItemProvider(newsListAdapter); //Adatper设置到View
            newsListAdapter.notifyDataChanged(); //刷新数据
        }
    
    
        private void initListener() {
            newsListContainer.setItemClickedListener((listContainer, component, i, l) -> {
                //路由跳转"action.detail"
                LogUtil.info(TAG, "onItemClicked is called");
                Intent intent = new Intent();
                Operation operation = new Intent.OperationBuilder()
                        .withBundleName(getBundleName())
                        .withAbilityName("com.example.myapplication.MainAbility")
                        .withAction("action.detail")
                        .build();
                intent.setOperation(operation);
                startAbility(intent);
            });
        }
        
        private void initData() {
            ...
            totalNewsDatas = new ArrayList<>();
            newsDatas = new ArrayList<>();
            initNewsData();//填充newsDatas
            newsListAdapter = new NewsListAdapter(newsDatas, this);//设置到Adapter
        }
    
        ...
    }
    

    类似ListView的用法,通过Adatper加载数据; setItemClickedListener中通过路由跳转MainAbilityDetailSlice。

    Layout_news_list_layout布局文件定义如下,ListContainer即ListView,是Comopnent的一个子类,Component就是HarmonyOS中的View

    <?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">
    
        <ListContainer
            ohos:id="$+id:selector_list"
            ohos:height="40vp"
            ohos:width="match_parent"
            ohos:orientation="horizontal"
            />
    
        <Component
            ohos:height="0.5vp"
            ohos:width="match_parent"
            ohos:background_element="#EAEAEC"
            />
    
        <ListContainer
            ohos:id="$+id:news_container"
            ohos:height="match_parent"
            ohos:width="match_parent"/>
    
    
    </DirectionalLayout>
    

    看一下Adapter的实现, 继承自BaseItemProvider

    /**
     * News list adapter
     */
    public class NewsListAdapter extends BaseItemProvider {
        private List<NewsInfo> newsInfoList;
        private Context context;
    
        public NewsListAdapter(List<NewsInfo> listBasicInfo, Context context) {
            this.newsInfoList = listBasicInfo;
            this.context = context;
        }
    
        @Override
        public int getCount() {
            return newsInfoList == null ? 0 : newsInfoList.size();
        }
    
        @Override
        public Object getItem(int position) {
            return Optional.of(this.newsInfoList.get(position));
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public Component getComponent(int position, Component componentP, ComponentContainer componentContainer) {
            ViewHolder viewHolder = null;
            Component component = componentP;
            if (component == null) {
                component = LayoutScatter.getInstance(context).parse(ResourceTable.Layout_item_news_layout, null, false);
                viewHolder = new ViewHolder();
                Component componentTitle = component.findComponentById(ResourceTable.Id_item_news_title);
                Component componentImage = component.findComponentById(ResourceTable.Id_item_news_image);
                if (componentTitle instanceof Text) {
                    viewHolder.title = (Text) componentTitle;
                }
                if (componentImage instanceof Image) {
                    viewHolder.image = (Image) componentImage;
                }
                component.setTag(viewHolder);
            } else {
                if (component.getTag() instanceof ViewHolder) {
                    viewHolder = (ViewHolder) component.getTag();
                }
            }
            if (null != viewHolder) {
                viewHolder.title.setText(newsInfoList.get(position).getTitle());
                viewHolder.image.setScaleMode(Image.ScaleMode.STRETCH);
            }
            return component;
        }
    
        /**
         * ViewHolder which has title and image
         */
        private static class ViewHolder {
            Text title;
            Image image;
        }
    }
    

    基本上就是标准的ListAdatper,把View替换成Component而已。

    关于模拟器

    代码完成后可以再模拟器中运行。关于模拟器有几点想说的:

    1. Harmony的模拟器启动非常快,无需下载镜像,因为这个模拟器并非本地运行,而只是一个远端设备的VNC,因此必须在线使用,而且不够流畅时有丢帧现象。虽然真机调试效果更好,但不是人人都买得起P40的

    2. 模拟器嵌入到IDE窗口显示(像Preview窗口一样),非独立窗口,这会带来一个问题,当同时打开多个IDE时,模拟器可能会显示在另一个IDE中(就像Logcat跑偏一样)。

    3. 想使用模拟器必须进过开发者认证,官方推荐使用银行卡认证。模拟器远端链接的是一台真实设备,难道是为未来租用设备要计费??image.png记得以前看过一篇文章,如果是来自国外地区的注册账号可以免认证使用模拟器,但是懒得折腾了


    3. 开发JS应用


    除了Java,鸿蒙还支持基于JS开发应用,借助前端技术完善其跨平台能力。

    鸿蒙为JS工程提供了多种常用UI组件,但是没有采用当下主流的react、vue那样JS组件,仍然是基于CSS3/HTML5/JS这种传统方式进行开发。JS工程结构如下
    image.png

    目录说明
    common可选,用于存放公共资源文件,如媒体资源、自定义组件和JS文档等
    i18n可选,用于存放多语言的json文件
    pages/index/index.hmlhml文件定义了页面的布局结构,使用到的组件,以及这些组件的层级关系
    pages/index/index.csscss文件定义了页面的样式与布局,包含样式选择器和各种样式属性等
    pages/index/index.jsjs文件描述了页面的行为逻辑,此文件里定义了页面里所用到的所有的逻辑关系,比如数据、事件等
    resources可选,用于存放资源配置文件,比如:全局样式、多分辨率加载等配置文件
    app.js全局的JavaScript逻辑文件和应用的生命周期管理。

    4. 跨设备迁移


    通过前面的介绍,可能感觉和Android大同小异,但是HarmonyOS最牛逼之处是多端协作能力,例如可以将Page在同一用户的不同设备间迁移,实现无缝切换。

    以Page从设备A迁移到设备B为例,迁移动作主要步骤如下:

    • 设备A上的Page请求迁移。
    • HarmonyOS回调设备A上Page的保存数据方法,用于保存迁移必须的数据。
    • HarmonyOS在设备B上启动同一个Page,并回调其恢复数据方法。

    通过调用continueAbility()请求迁移。如下,获取设备列表,配对成功后请求迁移

    doConnectImg.setClickedListener( 
    	clickedView -> { 
    		// 通过FLAG_GET_ONLINE_DEVICE标记获得在线设备列表 
    		List deviceInfoList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE); 
    		if (deviceInfoList.size() < 1) { 
    			WidgetHelper.showTips(this, "无在网设备"); 
    		} else { 
    			DeviceSelectDialog dialog = new DeviceSelectDialog(this); 
    			// 点击后迁移到指定设备 
    			dialog.setListener( 
    				deviceInfo -> { 
    					LogUtil.debug(TAG, deviceInfo.getDeviceName()); 
    					LogUtil.info(TAG, "continue button click"); 
    					try { 
    						// 开始任务迁移 
    						continueAbility(); 
    						LogUtil.info(TAG, "continue button click end"); 
    					} catch (IllegalStateException | UnsupportedOperationException e) { 
    						WidgetHelper.showTips(this, ResourceTable.String_tips_mail_continue_failed); 
    					} 
    					dialog.hide(); 
    				}); 
    			dialog.show(); 
    		} 
    	});
            
    

    Page迁移涉及到数据传递,此时需要借助IAbilityContinuation进行通信。

    跨设备通信 IAbilityContinuation

    跨设备迁移的Page需要实现IAbilityContinuation接口。

    Note: 一个应用可能包含多个Page,仅需要在支持迁移的Page中通过以下方法实现IAbilityContinuation接口。同时,此Page所包含的所有AbilitySlice也需要实现此接口。

    public class MainAbility extends Ability implements IAbilityContinuation { 
        ... 
        @Override 
        public void onCompleteContinuation(int code) {} 
     
        @Override 
        public boolean onRestoreData(IntentParams params) { 
            return true; 
        } 
     
        @Override 
        public boolean onSaveData(IntentParams params) { 
            return true; 
        } 
     
        @Override 
        public boolean onStartContinuation() { 
            return true; 
        } 
    }
    public class MailEditSlice extends AbilitySlice implements IAbilityContinuation { 
        ... 
        @Override 
        public boolean onStartContinuation() { 
            LogUtil.info(TAG, "is start continue"); 
            return true; 
        } 
     
        @Override 
        public boolean onSaveData(IntentParams params) { 
            ... 
            LogUtil.info(TAG, "begin onSaveData:" + mailData); 
            ... 
            LogUtil.info(TAG, "end onSaveData"); 
            return true; 
        } 
     
        @Override 
        public boolean onRestoreData(IntentParams params) { 
            LogUtil.info(TAG, "begin onRestoreData"); 
            ... 
            LogUtil.info(TAG, "end onRestoreData, mail data: " + cachedMailData); 
            return true; 
        } 
     
        @Override 
        public void onCompleteContinuation(int i) { 
            LogUtil.info(TAG, "onCompleteContinuation"); 
            terminateAbility(); 
        } 
    }
    
    • onStartContinuation(): Page请求迁移后,系统首先回调此方法,开发者可以在此回调中决策当前是否可以执行迁移,比如,弹框让用户确认是否开始迁移。

    • onSaveData(): 如果onStartContinuation()返回true,则系统回调此方法,开发者在此回调中保存必须传递到另外设备上以便恢复Page状态的数据。

    • onRestoreData(): 源侧设备上Page完成保存数据后,系统在目标侧设备上回调此方法,开发者在此回调中接受用于恢复Page状态的数据。注意,在目标侧设备上的Page会重新启动其生命周期,无论其启动模式如何配置。且系统回调此方法的时机在onStart()之前。

    • onCompleteContinuation(): 目标侧设备上恢复数据一旦完成,系统就会在源侧设备上回调Page的此方法,以便通知应用迁移流程已结束。开发者可以在此检查迁移结果是否成功,并在此处理迁移结束的动作,例如,应用可以在迁移完成后终止自身生命周期。

    以Page从设备A迁移到设备B为例,详细的流程如下:

    1. 设备A上的Page请求迁移。
    2. 系统回调设备A上Page及其AbilitySlice栈中所有AbilitySlice实例的IAbilityContinuation.onStartContinuation()方法,以确认当前是否可以立即迁移。
    3. 如果可以立即迁移,则系统回调设备A上Page及其AbilitySlice栈中所有AbilitySlice实例的IAbilityContinuation.onSaveData()方法,以便保存迁移后恢复状态必须的数据。
    4. 如果保存数据成功,则系统在设备B上启动同一个Page,并恢复AbilitySlice栈,然后回调IAbilityContinuation.onRestoreData()方法,传递此前保存的数据;此后设备B上此Page从onStart()开始其生命周期回调。
    5. 系统回调设备A上Page及其AbilitySlice栈中所有AbilitySlice实例的IAbilityContinuation.onCompleteContinuation()方法,通知数据恢复成功与否。

    5. 总结和感想


    1. 从SDK到IDE与Android都高度相似,任何Android开发者基本上就是一个准鸿蒙程序员
    2. AndroidStudio的功能迭代很快,DevEco Studio在功能上还存在较大差距
    3. 需要实名认证开发者之后才能使用IDE的各种完整功能,内心抗拒
    4. 源码需要另外下载,对调试不友好
    5. 当前还不支持Kotlin。大势所趋,所以未来一定会支持,而且Kotlin是开源的问题不大
    6. JS UI框架的技术架构同样有些过时
    7. 杀手锏是对多端协作的支持,但这可能需要更多的厂商加入才能真正发挥威力

    感想: 目前人们对于鸿蒙的态度呈现两极化:有的人追捧有的人贬低,我觉得都大可不必,让我们多给鸿蒙一些空间和耐心,静观其变、乐见其成。当然这首选需要华为做到自己不主动炒作,真正静下心来打磨鸿蒙,只要华为有决心有耐心,作为开发者的我们为什么不支持呢?

    Harmony线上挑战赛

    伴随开发者活动日,鸿蒙还举办了多轮线上挑战赛活动(目前还在进行中),难度不高参与即能完成,且中奖率很高(亲测),有兴趣可以参与一下,希望我的好运传递给你

    活动地址

    image.png

    相关链接

    • HarmonyOS官方 https://www.harmonyos.com/cn/home
    • HarmonyOS开发者文档 https://developer.harmonyos.com/cn/documentation
    • HarmonyOS源码 https://gitee.com/openharmony
    • HarmonyOS课程 https://developer.huawei.com/consumer/cn/training/paths/c1a74183-8245-4208-9c45-fa79367f06b2
    展开全文
  • 感谢关注HarmonyOS,为了便于大家学习特将鸿蒙2.0基础教学内容整理如下:1、HarmonyOS应用开发—视频播放https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-hap1/index.html#02、HarmonyOS应用开发—基本...

    感谢关注HarmonyOS,为了便于大家学习特将鸿蒙2.0基础教学内容整理如下:

    1、HarmonyOS应用开发—视频播放

    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-hap1/index.html#0

    2、HarmonyOS应用开发—基本控件

    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-hap2/index.html#0

    3、HarmonyOS应用开发—UI开发与预览

    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-ui/index.html#0

    4、HarmonyOS应用开发—设备虚拟化特性开发

    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-screenhardware/index.html#0

    5、HarmonyOS应用开发—HelloWorld应用开发E2E体验

    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-HelloWorld/index.html#0

    6、HarmonyOS应用开发—有界面元程序交互

    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-hap6/index.html#0

    7、HarmonyOS应用开发-分布式任务调度

    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-hap5/index.html#0

    8、HarmonyOS应用开发—剪切板

    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-hap4/index.html#0

    9、HarmonyOS应用开发—应用偏好数据读写

    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-hap3/index.html#0

    以下为HarmonyOS应用开发—HelloWorld应用开发E2E体验节选部分,如想进一步了解,请点击:HarmonyOS应用开发—HelloWorld应用开发E2E体验

    一、介绍

    本篇将实现的内容

    智慧屏是首个搭载HarmonyOS的终端产品,通过HarmonyOS智慧屏多页签应用开发,让开发者了解HarmonyOS应用开发的全流程,20分钟快速上手,实现从工程创建到应用上架全过程。

    您将建立什么

    在这个Codelab中,您将使用HUAWEI DevEco Studio(IDE)开发HarmonyOS智慧屏多页签应用,完成开发者证书申请,工程创建、编译构建、应用调试,并实现HarmonyOS智慧屏部署和运行。

    您将学到什么

    如何创建一个HarmonyOS Project

    申请/配置调试签名证书

    编译构建hap包

    将hap包部署到智慧屏远程模拟器上,并运行

    二、您需要什么

    1. 硬件要求

    操作系统:Windows10 64位

    内存:8G及以上。

    硬盘:100G及以上。

    分辨率:1280*800及以上

    2. 软件要求

    需手动下载安装,详细步骤请参考《DevEco Studio使用指南》2.1.2

    JDK:DevEco Studio自动安装。

    Node.js:请手动下载安装,详细步骤请参考《DevEco Studio使用指南》2.1.3 下载和安装Node.js。

    HarmonyOS SDK:待DevEco Studio安装完成后,利用DevEco Studio来加载HarmonyOS SDK。详细步骤请参考《DevEco Studio使用指南》2.1.6 加载HarmonyOS SDK。

    Maven库依赖包:如需手动拷贝和配置,详细步骤请参考《DevEco Studio使用指南》2.3 离线方式配置Maven库。

    3. 需要的知识点

    Java基础开发能力。

    三、能力接入准备

    实现HarmonyOS智慧屏部署和运行,需要完成以下准备工作:

    HUAWEI DevEco Studio环境搭建

    HarmonyOS门户申请调试证书

    具体操作,请按照《HUAWEI DevEco Studio使用指南》中详细说明来完成。

    具体操作,请按照《DevEco Studio使用指南》中详细说明来完成。

    提示:需要通过注册成开发者才能完成集成准备中的操作。

    四、HarmonyOS应用开发

    1. 创建工程

    创建一个空工程,选择多页签Tab Feature Ability类型,并命名工程名和包名。

    ba5ba718230dd0c6730e0d94d652834e.png

    一起看看工程目录结构

    dffb5002e6df6ee0280d8d4eac552882.png

    44581fb71b2b546ce9eab70765e2e2c3.png

    目录结构中文件分类如下:

    .hml结尾的HML模板文件,这个文件用来描述当前页面的文件布局结构,类似于网页中的HTML文件。

    .css结尾的CSS样式文件,这个文件用于描述页面样式。

    .js结尾的JS文件,这个文件用于处理页面和用户的交互。

    各个文件夹的作用:

    app.js文件用于全局JavaScript逻辑和应用生命周期管理。 pages目录用于存放所有组件页面。

    common目录用于存放公共资源文件,比如:媒体资源,自定义组件和JS文件。

    resources目录用于存放资源配置文件,比如:全局样式、多分辨率加载等配置文件。

    i18n目录用于配置不同语言场景资源内容,比如应用文本词条,图片路径等资源。

    2. 编码

    本次需要在zh-CN.json和index.hml 2个文件里编码,在common目录下导入若干张图片。

    b33e8d56ff04cddaca7af713ac301a77.png

    zh-CN.json

    {

    "Strings": {

    "title": "华为智慧屏",

    "subtitle": "历史观看",

    "tab": ["首页","电影","电视剧","购物","溪村风景","图册","少儿","VIP"],

    "images": ["/common/img-large1.png","/common/img-large2.png","/common/img-large3.png","/common/img-large4.png"],

    "text": "文本内容",

    "details": [

    {

    "text": "花园",

    "pic": "/common/img-small1.png"

    },

    {

    "text": "风景一觉",

    "pic": "/common/img-small2.png"

    },

    {

    "text": "蓝天白云",

    "pic": "/common/img-small3.png"

    },

    {

    "text": "池塘",

    "pic": "/common/img-small4.png"

    },

    {

    "text": "办公一角",

    "pic": "/common/img-small5.png"

    }

    ]

    },

    "Files": {

    }

    }

    index.hml

    {{title}}

    onblur ="iconBlurFunc">

    {{item}}

    {{subtitle}}

    {{deatilitem.text}}

    3.申请调试签名证书

    本工程已经提前为您申请了证书,存放在cer目录下。

    4. 配置调试签名证书

    点击File→Project Structure进行签名配置即可,其中,debug表示调试签名证书,release表示发布签名证书。Store Password和KeyPassword一样,均为helloharmonyos123

    ec89cd231fe7f5c4225baf0b9fdae051.png

    配置完成后点击OK,自动在entry/build.gradle生成签名代码块。

    e6ff90592aa9e45fee25b2cf14c880be.png

    你也可以如上图一样,配置成绝对路径,如:

    certpath file('./../cer/helloharmonyos.cer')

    四. 编译构建hap包

    1d18e48c556a8b7bb164c869ecb6cad5.png

    a5a6b4b4730762db9294c2f8c945a4e2.png

    部署并运行

    五.布局截图:

    启动模拟器,登录华为开发者账号。

    c050a2a791fa874717672a2c0f324f3a.png

    选择智慧屏模拟器(HD)。

    84b99462dafe5b3ff4174588795f11b2.png

    将hap包部署到智慧屏上,并运行(run)。

    af6eb5d5f1c9e1a6bc6b38188d306143.png

    7d4267dce77117a1af2d6cd9cf6a7c83.png

    至此,你已经成功开发出第一个HarmonyOS应用,欢迎进入HarmonyOS世界!

    五、恭喜你

    干得好,你已经成功完成了HelloWorld应用开发E2E体验,并学到了:

    如何创建一个HarmonyOS Project

    申请/配置调试签名证书

    编译构建hap包

    将hap包部署到智慧屏远程模拟器上,并运行

    【如果您想学习HarmonyOS 应用开发基础教程 请猛戳】

    展开全文
  • 发布会上,华为消费者业务软件部总裁王成录为开发者带来了一个全面升级的华为鸿蒙版本,各方面能力的大幅提升,完整的应用开发生态,超级终端的全场景生态,即将开启移动生态的下一下新纪元。在参加完鸿蒙2.0的发布...

    2020年9月10日,HarmonyOS 2.0的发布对于IT界来说又是一件翘首以盼的大事。发布会上,华为消费者业务软件部总裁王成录为开发者带来了一个全面升级的华为鸿蒙版本,各方面能力的大幅提升,完整的应用开发生态,超级终端的全场景生态,即将开启移动生态的下一下新纪元。

    在参加完鸿蒙2.0的发布会后,又周转于9月11日华为联合南北向业务合作伙伴以及应用生态合作伙伴共同主持的各技术分论坛活动。作为一名从事移动应用相关产业近十余年的工作者,自然是对华为鸿蒙2.0提供的完整的应用开发生态更为感兴趣。

    《从零开始开发HarmonyOS应用》是华为展示的第一个鸿蒙应用示例,示例简单的介绍了多设备自适应布局、输入事件处理、和跨设备流转。

    6baa25443f739c74ce21b7143cfeb99d.png

    1 创建应用工程

    使用 DevEco Studio 创建应用工程,在菜单栏打开“File>New>New Project”,在弹出的对话框中选择java工程模板

    2ee2785cf3fd1e9ec51a9b9775bfa35c.png

    选择好模板之后点击“Next”,在下一个界面中指定“Project Name”和“Package Name”,然后点击“Finish”即可建立工程

    f0f4bab06a4c09cab1149f2d7ee737d7.png

    一个建立好的工程包含以下目录

    f229bb1f26051051107a872dc9f46332.png

    2 设计用户界面

    在Java UI框架中,提供了两种编写布局的方式:在XML中声明UI布局和在代码中创建布局。这两种方式创建出的布局没有本质差别,此例主要通过XML的方式编写应用的页面

    2.1 XML编写页面

    2.1.1 新建XML页面

    在“Project”窗口,打开“entry > src > main > resources > base”,右键点击“base”文件夹,选择“New > Directory”,命名为“layout”。

    5e4040406ea0f2506422149358352bbf.png

    右键点击“layout”文件夹,选择“New > File”命名为“main_layout.xml”。

    0d108a39bf7192f33093f60b118f25c9.png

    在“layout”文件夹下可以看到新增了“main_layout.xml”文件。

    4de6fa06a56dbe1a385040ccf6bfeb6c.png

    2.1.2 编写XML代码

    这个示例中自适应布局的实现,主要是基于AdaptiveBoxLayout新的布局样式,它可以将布局在横竖屏设备上进行自适应分布排列。开发者可以将布局代码写在“main_layout.xml”文件,关于布局代码怎样实现可以参考https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-component-layout-xml-0000000000500395

    如果布局中引用到图片资源,需要将图片放到 “resources>base>media”

    bc73ef5b0aa52e039a2c5a8e3d16706c.png

    b87484e333712879bb6cfcf04ee1b839.png

    2.2加载XML布局

    在“Project”窗口中,选择“entry > src > main > java > com.huawei.example.helloworld > slice”,打开“MainAbilitySlice.java”文件。重写onStart()方法加载XML布局,示例代码如下:

    1.package com.huawei.example.helloworld.slice;

    2.import com.huawei.example.helloworld.ResourceTable;

    3.import ohos.aafwk.ability.AbilitySlice;

    4.import ohos.aafwk.content.Intent;

    5.

    6.public class MainAbilitySlice extends AbilitySlice {

    7.

    8.    @Override

    9.    public void onStart(Intent intent) {

    10.        super.onStart(intent);

    11.        super.setUIContent(ResourceTable.Layout_main_layout); // 加载XML布局

    12.    }

    13.

    14.    @Override

    15.    public void onActive() {

    16.        super.onActive();

    17.    }

    18.

    19.    @Override

    20.    public void onForeground(Intent intent) {

    21.        super.onForeground(intent);

    22.    }

    23.}

    应用运行效果如图所示:

    dd7643a6a52aff3fa473f87343de33f9.png

    3 输入事件处理

    输入事件包括两种,一种是触控事件,一种是按键事件。

    3.1 触控事件

    组件的一个重要作用是当用户点击组件时,会执行相应的操作或者界面出现相应的变化。用户点击组件时,组件对象将收到一个点击事件。开发者可以自定义响应点击事件的方法。例如,通过创建一个Component.ClickedListener对象,然后通过调用setClickedListener将其分配给组件。示例代码如下1. //1.先导入ohos.agp.components.Image

    2. //2.从定义的xml中获取Image对象

    3. Image remote = (Image) findComponentById(ResourceTable.Id_remote);

    4. //3.为Image设置点击事件回调

    5. remote.setClickedListener(component -> {

    6.     //4.此处添加点击按钮后的事件处理逻辑

    7.      migrateAbility();

    8. });

    3.2 按键点击事件

    当设备按键按下时,相应的Ability对象将收到一个KeyEvent事件。开发者可以自定义响应点击事件的方法

    一个示例代码如下1.public boolean onKeyEvent(Component component, KeyEvent keyEvent) {

    2.    if (keyEvent.isKeyDown()

    3.            && keyEvent.getKeyCode() == KeyEvent.KEY_DPAD_CENTER

    4.            && component.getId() == ResourceTable.Id_remote) {

    5.        continueAbility();

    6.        return true;

    7.    }

    8.    return false;

    9.}

    4 跨设备流转

    4.1 申请权限

    权限即系统用于控制第三方应用或服务访问用户敏感个人数据或操作敏感能力的授权方式,当第三方应用或服务尝试访问用户个人数据或操作敏感能力时,系统通过弹窗的形式请求用户授权。用户可授权此应用使用相关权限,后续也可取消此授权。例如打车类应用为了定位,在获取用户的地理位置信息前需向用户申请,用户同意此应用使用,后续也可取消此授权。

    当使用“流转”功能需要申请迁移权限DISTRIBUTED_DATASYNC

    4.1.1 在config.json中声明权限1. "reqPermissions": [

    2.  {

    3.   "name": "ohos.permission.DISTRIBUTED_DATASYNC"

    4.  }

    5. ]

    4.1.2 在MainAbilitySlice.java中请求权限1.private void migrateAbility() {

    2.    if (verifySelfPermission(SystemPermission.DISTRIBUTED_DATASYNC)

    3.            == IBundleManager.PERMISSION_GRANTED) {

    4.        this.continueAbility();

    5.    } else {

    6.        requestPermission(SystemPermission.DISTRIBUTED_DATASYNC);

    7.    }

    8.}

    4.2 跨设备流转

    仅continueAbility一行代码即可完成应用在设备之间流转,依托的还是鸿蒙OS的分布式软总线、分布式数据库的能力。在此基础上将这些能力通过接口的形式提供开发者。

    事实上流转并非“一行代码可以完成”,如果开发者想在流转过程中做更多的事情,那么可以通过IAbilifyContinuation接口中的方法进行实现。

    IAbilityContinuation接口方法说明如下接口名称说明

    onStartContinuationPage请求迁移后,系统首先回调此方法,开发者可以在此回调中决策当前是否可以执行迁移,比如,弹框让用户确认是否开始迁移。

    onSaveData如果onStartContinuation()返回true,则系统回调此方法,开发者在此回调中保存必须传递到另外设备上以便恢复Page状态的数据。

    onRestoreData源侧设备上Page完成保存数据后,系统在目标侧设备上回调此方法,开发者在此回调中接受用于恢复Page状态的数据。注意,在目标侧设备上的Page会重新启动其生命周期,无论其启动模式如何配置。且系统回调此方法的时机在onStart()之前。

    onCompleteContinuation目标侧设备上恢复数据一旦完成,系统就会在源侧设备上回调Page的此方法,以便通知应用迁移流程已结束。开发者可以在此检查迁移结果是否成功,并在此处理迁移结束的动作,例如,应用可以在迁移完成后终止自身生命周期。

    Ability以及AbilitySlice都需要实现IAbilityContinuation接口,并实现其中的方法。示例代码如下1. @Override

    2. public boolean onStartContinuation() {

    3.     return true;

    4. }

    5.

    6. @Override

    7. public boolean onSaveData(IntentParams intentParams) {

    8.     return true;

    9. }

    10.

    11. @Override

    12. public boolean onRestoreData(IntentParams intentParams) {

    13.     return true;

    14. }

    15.

    16. @Override

    17. public void onCompleteContinuation(int i) {

    18.

    19. }

    通过示例讲解及代码开发过程解读,新的布局管理,新的资源文件结构,预示更为简洁且功能更为强大的应用开发生态已经诞生。相信丰富的系统API将带给我们开发者更多的便利及更强大的能力。

    作者: HarmonyOS技术社区

    展开全文
  • 文章目录一、鸿蒙系统(一)官网首页(二)基础概念 - Ability1、FA支持Page Ability2、PA支持Service Ability和Data Ability(1)Service模板(2)Data模板二、下载DevEco Studio三、安装DevEco Studio四、下载...

    一、鸿蒙系统

    (一)官网首页

    https://www.harmonyos.com/cn/home/
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    (二)基础概念 - Ability

    • Ability是应用所具备能力的抽象,也是应用程序的重要组成部分。一个应用可以具备多种能力(即可以包含多个Ability),HarmonyOS支持应用以Ability为单位进行部署。Ability可以分为FA(Feature Ability)和PA(Particle Ability)两种类型,每种类型为开发者提供了不同的模板,以便实现不同的业务功能。

    1、FA支持Page Ability

    • Page模板是FA唯一支持的模板,用于提供与用户交互的能力。一个Page实例可以包含一组相关页面,每个页面用一个AbilitySlice实例表示。

    2、PA支持Service Ability和Data Ability

    (1)Service模板

    • 用于提供后台运行任务的能力。

    (2)Data模板

    • 用于对外部提供统一的数据访问抽象。

    二、下载DevEco Studio

    三、安装DevEco Studio

    • 双击安装程序图标,进入安装向导,按照提示进行操作
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    四、下载HarmonyOS SDK

    (一)HarmonyOS SDK概述

    DevEco Studio提供SDK Manager统一管理SDK和这个包依赖的工具链。通过SDK Manager能自动下载各个语言对应的SDK包。

    SDK Manager提供多种编程语言的SDK包

    • Native:C/C++语言SDK包,默认不自动下载,需手动勾选下载。
    • JS:JS语言SDK包,默认不自动下载,需手动勾选下载。
    • Java:Java语言SDK包,首次下载SDK时默认下载

    SDK对应的工具链(SDK Tools)和预览器:

    • Toolchains:SDK工具链,HarmonyOS应用开发必备工具集,包括编译、打包、签名、数据库管理等工具的集合,首次下载SDK时默认下载
    • Previewer:Lite Wearable预览器,在开发过程中可以动态预览Lite Wearable应用的界面呈现效果,默认不自动下载,需手动勾选下载。

    (二)下载HarmonyOS SDK

    • 启动DevEco Studio
      在这里插入图片描述
      在这里插入图片描述
    • 安装SDK组件
      在这里插入图片描述
      在这里插入图片描述
    • 许可证协议
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    五、第一个应用 - HelloWorld

    (一)创建鸿蒙项目

    • 单击【Create HarmonyOS Project】
      在这里插入图片描述
    • 选择设备与模板
      在这里插入图片描述
    • 配置项目
      在这里插入图片描述
      在这里插入图片描述

    (二)连接鸿蒙模拟器 - HVD(HarmonyOS Virtual Device)

    • 开发应用的时候需要模拟器跑效果,需要在DevEco Studio菜单栏,点击Tools > HVD Manager开发模拟器,第一次打开,会自动下载相关资料。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
    • 选择个人银行认证方式
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
    • 启动P40模拟器
      在这里插入图片描述

    (三)启动应用,查看效果

    在这里插入图片描述
    在这里插入图片描述

    • 设置显示模式 - Window模式
      在这里插入图片描述

    (四)修改屏幕显示内容及样式

    1、修改字符串资源文件 - string.json

    在这里插入图片描述

    2、修改主布局资源文件 - ability_main.xml

    在这里插入图片描述

    • 布局:鸿蒙的DirectionalLayout布局相当于安卓的LinearLayout布局
    • 对齐:鸿蒙的alignment布局属性相当于安卓的gravity布局属性
    • 控件:鸿蒙的Text控件相当于安卓的TextView控件
    • 尺寸:鸿蒙的fp相当于安卓的spvp相当于安卓的dp

    3、启动应用,查看效果

    在这里插入图片描述

    展开全文
  • 目前鸿蒙OS还没有正式发布,但是可以通过申请公测尝鲜。作者于4/28放假申请,5/7收到推送并升级。以下是升级成功之后的版本信息。 连续点击版本号信息,画面提示【系统已经进入开发者模式】之后,从设定画面...
  • 快速上手菁瑞优智HarmonyOS应用开发课程 1、鸿蒙系统介绍 本课程规划、介绍与基础必备知识;鸿蒙典型案例;鸿蒙系统特性(系统架构等);鸿蒙系统生态;鸿蒙系统潜力和未来爆发点;项目演示 2、鸿蒙系统应用开发基础...
  • 设置页面框架:部分代码如下:xmlns:ohos="http://schemas.huawei.com/res/ohos"ohos:height="$float:singleCardViewHeight"ohos:width="match_parent">ohos:id="$+id:item_content_text"ohos:height="$float:...
  • 对话框是应用程序的主要输入手段之一,但是遗憾的是目前鸿蒙开发网站上只有ToastDialog用法,其他类型的对话框则只能参考为数不多的英文文档。 以下是作者经过不断尝试,终于鼓捣出来的CommonDialog对话框。 ...
  • 距离HarmonyOS 2.0发布已有一个月,广大开发者学习热情高涨,为助力开发者能够运用HarmonyOS顺利开应用,华为开发者学院正式推出“HarmonyOS应用开发系列课”,此课程分为基础、进阶和高级,全部免费,共有近20位...
  • 2020 HDC,HarmonyOS 2.0终于揭开神秘面纱,咱的自主操作...于是,勤劳的小编按捺不住激动到颤抖的手手,迫不及待整理了HarmonyOS应用开发的学习路线,伙伴们速来围观啦!认识HarmonyOSHarmonyOS这款“面向未来”的...
  • 本文介绍在鸿蒙应用中button组件的基本用法。 增加按钮组件 如下代码中红色部分所示,在布局中增加button组件。 <?xml version="1.0" encoding="utf-8"?> <DirectionalLayout xmlns:ohos=...
  • 发布会上,华为消费者业务软件部总裁王成录为开发者带来了一个全面升级的华为鸿蒙版本,各方面能力的大幅提升,完整的应用开发生态,超级终端的全场景生态,即将开启移动生态的下一下新纪元。在参加完鸿蒙2.0的发布...
  • 接下来是我们的两分钟科普,一分钟玩转HarmonyOS应用开发在线体验,一分钟简单了解“一次开发、多设备部署”的原理。萌新的开发者也能第一时间掌握,往下看吧~ 一分钟玩转HarmonyOS应用开发在线体验 只需一分钟,...
  • 本节我们将对整个项目目录结构做简要说明,以及如何跳转到Hi HarmonyOS页面(HelloHarmonyOS是基于Java的,暂不涉及XML和JS)。HelloHarmonyOS项目目录结构在整合目录结构中,作为初学者我们不需要关注entry(应用主...
  • 这个效果实在是无法用于实际的应用开发。本文介绍如何定制自己的CommonDialog。还是先看演示视频: CustomizeCommonDialog 准备布局 定制CommonDialog的第一步是定义对话框的布局,具体如下: <?xml ...
  • 鸿蒙应用开发--组件

    2021-11-13 15:22:45
    鸿蒙应用开发–组件 组件分类为显示类组件和交互类组件 ID:id 高度height:match_content包裹内容\match_parent填充父类 宽度width:match_content包裹内容\match_parent填充父类 大小(单位:像素px)设定为px值时...
  • 1、let和var的异同 (1)不同之处 js块级作用域: 使用var 关键字声明的变量不具备块级作用域的特性,它在 {} 外依然能被访问到。 ...let 声明的变量只在 let 命令所在的代码块{}内有效,在{}之外不能访问。...
  • 选择【添加设备】,之后输入设备名,类型和自学鸿蒙应用开发(40)- 真机调试之准备真机最后获取的udid之后点【确定】。 退回主画面,进入【我的项目】。 选择【添加项目】。 输入名称之后,按下【确认】。 选择...
  • 本文介绍在鸿蒙应用中Picker组件的基本用法。 增加Picker组件 如下代码中46行~56行所示,在布局中增加Picker组件。 <?xml version="1.0" encoding="utf-8"?><DirectionalLayout xmlns:ohos=...
  • 4.1 开发完第一个鸿蒙应用后,下面在了解一下完整的鸿蒙应用打包发布后应该是什么样子:一个完整的打包后应用结构如下图所示,这里我们先了解结构,具体怎么打包很简单只要前提是要签名!1. HAP的分类HAP又可分为...
  • 秒表应用的功能就是计时,其中有一种情况就是计算地图上两点之间移动的时间。但是作者在实际使用这个应用的时候,经常会忘了在预定地点开始和停止计时。...TinyMap是董昱老师开发鸿蒙开源项目,我们首先直接在秒表应
  • 在进行鸿蒙应用开发中由于每个人的开发习惯不同,鸿蒙官方文档说明中也是支持多种开发方式,今天跟大家聊聊关于JS跟Java之间混合开发方式。基本介绍首先是因为我个人习惯使用JS进行页面开发布局,但是鸿蒙提供的Java...
  • { "module": { "reqPermissions": [ { "name": "ohos.permission.INTERNET" } ] } } 获取并设置网络图片 String urlImage = "https://www.harmonyos.com/resource/image/community/20201009-164134eSpace.jpg";...
  • 黑马程序员 《HarmonyOS应用开发实战教程》 从入门到实战 助你快速掌握鸿蒙应用开发技术 快来一起学习吧 ???????????? 往期视频内容,戳下方标题查看: ◆ 鸿蒙应用开发教程第00期:快速入门,做第1个吃螃蟹的人 ...
  • 执行结果: DirectionalLayout的详细信息可以参照鸿蒙官方的开发文档: https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-layout-directionallayout-0000001050769565  新书介绍 ...
  • 原标题:华为鸿蒙 HarmonyOS 应用开发在线体验网站上线IT之家 4 月 22 日消息 华为 HarmonyOS 应用开发在线体验网站现已上线。开发者可以通过在线体验“To-Do List”Demo,了解 HarmonyOS“一次开发、多设备部署”...
  • 本篇文章主要讲解鸿蒙os的开发工具安装使用教程、鸿蒙os应用开发说明指引、鸿蒙os对于开发者的机遇以及鸿蒙os是否会成为主流操作系统的问题刨析。 日期:2021-6-30 作者:csdn 任聪聪 一、相关文档和下载地址 1....
  • 今天写第一个华为手表的鸿蒙应用 Hello World。希望大家多支持!!!1. 创建工程,我目前知道的只有华为Watch GT2 pro是第一批开放给开发者可以安装鸿蒙app的,有这款手表的人都可以体验一下,哈哈,就是有点小贵。...
  • 目录:鸿蒙应用开发入门(一):鸿蒙系统的概述鸿蒙应用开发入门(二):开发环境搭建鸿蒙应用开发入门(三):开发第一个鸿蒙应用鸿蒙应用开发入门(四):进一步了解第一个例子里的细节3.1 第一个鸿蒙应用实现需求编写两张...
  • 中级考试题:(其中选择题1个错误,多选一个错误,单选三个错误),考80没问题, ...3 HarmonyOS中,不同设备上包名和签名都相同应用的分布式文件沙箱是互通的。True 4 在硬件虚拟化能力中,一个设备仅能

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,492
精华内容 4,596
关键字:

鸿蒙应用开发