鸿蒙HarmonyOS应用开发初体验,HarmonyOS鸿蒙 java面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新HarmonyOS鸿蒙全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img

img
img
htt

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注鸿蒙)
img

正文

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

下载SDK

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

image.png

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

关于SDK源码

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

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"?>

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

/**

  • News list adapter
    */
    public class NewsListAdapter extends BaseItemProvider {
    private List newsInfoList;
    private Context context;

public NewsListAdapter(List 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应用


网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

是懒得折腾了

3. 开发JS应用


网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
[外链图片转存中…(img-7dxw5yFE-1713654119425)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值