intermediates ->..._鸿蒙app开发教程">
当前位置:   article > 正文

android简单app实例代码_我的第一个鸿蒙app,以及所见内容(ZT)

鸿蒙app开发教程

知乎上很火的帖子,转过来大家看看。

首先声明一下,我不会得出鸿蒙是安卓换皮这样的结论,这话题见仁见智,这里我只记录开发过程中所见到的内容,该文章仅做鸿蒙开发交流

做为一名安卓开发……

2dd74a0c67247d434520dc8a5f7247f2.png

见到鸿蒙2.0上线了,当然得体验一下,然后和其他猿一样,成功地看到让人激动的"hello world"

485e9c726e1514cd8400c8025bccc212.png

可是接下来看到的,到让我感到意外,因为run之后,我竟然在build -> intermediates -> shell -> debug -> src -> main -> java -> com -> 包名 目录下看到安卓的原生代码

3105116a75322e7fa65a3df06c7d4bb6.png

首先是androidManifest文件夹的内容

5e09d56d527dc51cdfb0b7054875b2ec.png

从内容可以看到,application导向ShellMyApplication,第一个启动的activity为MainAbilityShellActivity,也就是build包里的那几个文件

点开之后可以看到父类在ohos.abilityshell包里,最终继承的是安卓的activity和application

b28d3286b8e3253d012ce97dd83ca8ec.png

ohos.abilityshell包下还有安卓的四大组件

7d71e2669b9ade6147624f0128db4f59.png

从代码里可以看到鸿蒙在这里给activity,service,provider分别写了代理类,有兴趣的可以自己去看源码

ohos.abilityshell里依赖的android,主模块是无法直接调用的,但这个对安卓开发不是难事,只要在主模块添加相同的依赖,就可以调用相对应的代码了,于是我在build.gradle里依赖了安卓包:implementation 'com.google.android:android:4.1.1.4'

2e4e38b5d93653a7edb421fe41b70cbe.png

如果鸿蒙app背后真的有一个安卓的application在运行,那么我们肯定能获取到这个application的实例,这对安卓开发来说,这也不是难事,写个反射就行

反射获取application

b78198fc1492014be0e1077017849b72.png

打印一下application的类名,顺便弹个Toast验证一下application是否可用……

682ef6dd3e4d7adff76129973802091e.png

然后奇迹发生了……

打印结果证明确实有个ShellMyApplication在背后运行

1c1188a90599e01688ce60e5c105dc68.png

Toast也正常弹出

b73becf36572c0a1a5193c2c398de0a8.png

Toast正常弹出,除了证明鸿蒙背后有个application在运行外,还证明了windowManager也是安卓的,继续推论的话,framework层也是安卓的……呃,扯远了

再看看activity是否被调用,验证也很简单,registerActivityLifecycleCallbacks监听一下就行

e8c16e9fba99d2f79785a2e1c9a09bd5.png

为了监听到activity的生命周期,我执行的操作:打开app->退回桌面->再打开app,结果嘛,当然一点意外都没有……MainAbilityShellActivity走了个完整的生命周期

8103e92341de03b67c1d27bfc636d0b1.png

application拿到了,那就彻底放飞自我……

首先是用安卓的方法打开自己的设置界面

abefca16888848f561ca530f99db2ce8.png

结果当然也没意外呢

9e6b0121cd4a6170f8f206e8262ef1e8.png

麻利地打开了……

再试试打开其他app,尝试打开拨号界面……

94d11b35dbc45aee965008a673853c98.png
d5457bfb68de7e7ffb07c275e5618a20.png

正常打开了,这至少证明鸿蒙系统里那个系统拨号app是个安卓app

打印了几次activity的生命周期,发现鸿蒙的AbilitySlice都是在activity的onstart()方法之后运行,所以我尝试在activity的onResume方法里添加给activity添加几个控件…

2d3a3a1632d76aeabb3fb8248d72b459.png

运行结果

8680f24f9aa86394065b1e5b141ce96c.png

查看绘制布局,发现在activity渲染的是一个整体

2b090a2b4961505ebcaf6da4ed64f38f.png

断点分析后发现activity只有一个子控件:AGPContainerView,数据太多这里就不截图了

打印这个类和他的父类,发现AGPContainerView是一个SurfaceView

da1dec76fedbcaec032fb536459fdda0.png

从这些信息大致可以推断出鸿蒙重新定义了一套新的ui api(ohos.agp.components包),那些承继自Component的控件,比如Text,Button,DirectionalLayout等都会在SurfaceView绘制

至于鸿蒙为什么要重新定义一套新的ui,那就不得而知了

作者:落花时节啃狗

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/267561
推荐阅读
相关标签
  

闽ICP备14008679号