鸿蒙HarmonyOS应用开发初体验(2),2024年最新面试最新经典100题

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

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

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

img
img
htt

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

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

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

正文

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应用


除了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线上挑战赛

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

相关链接

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

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

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

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

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

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

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值