intermediates ->..._鸿蒙app开发教程">
赞
踩
知乎上很火的帖子,转过来大家看看。
首先声明一下,我不会得出鸿蒙是安卓换皮这样的结论,这话题见仁见智,这里我只记录开发过程中所见到的内容,该文章仅做鸿蒙开发交流
做为一名安卓开发……
见到鸿蒙2.0上线了,当然得体验一下,然后和其他猿一样,成功地看到让人激动的"hello world"
可是接下来看到的,到让我感到意外,因为run之后,我竟然在build -> intermediates -> shell -> debug -> src -> main -> java -> com -> 包名 目录下看到安卓的原生代码
首先是androidManifest文件夹的内容
从内容可以看到,application导向ShellMyApplication,第一个启动的activity为MainAbilityShellActivity,也就是build包里的那几个文件
点开之后可以看到父类在ohos.abilityshell包里,最终继承的是安卓的activity和application
ohos.abilityshell包下还有安卓的四大组件
从代码里可以看到鸿蒙在这里给activity,service,provider分别写了代理类,有兴趣的可以自己去看源码
ohos.abilityshell里依赖的android,主模块是无法直接调用的,但这个对安卓开发不是难事,只要在主模块添加相同的依赖,就可以调用相对应的代码了,于是我在build.gradle里依赖了安卓包:implementation 'com.google.android:android:4.1.1.4'
如果鸿蒙app背后真的有一个安卓的application在运行,那么我们肯定能获取到这个application的实例,这对安卓开发来说,这也不是难事,写个反射就行
反射获取application
打印一下application的类名,顺便弹个Toast验证一下application是否可用……
然后奇迹发生了……
打印结果证明确实有个ShellMyApplication在背后运行
Toast也正常弹出
Toast正常弹出,除了证明鸿蒙背后有个application在运行外,还证明了windowManager也是安卓的,继续推论的话,framework层也是安卓的……呃,扯远了
再看看activity是否被调用,验证也很简单,registerActivityLifecycleCallbacks监听一下就行
为了监听到activity的生命周期,我执行的操作:打开app->退回桌面->再打开app,结果嘛,当然一点意外都没有……MainAbilityShellActivity走了个完整的生命周期
application拿到了,那就彻底放飞自我……
首先是用安卓的方法打开自己的设置界面
结果当然也没意外呢
麻利地打开了……
再试试打开其他app,尝试打开拨号界面……
正常打开了,这至少证明鸿蒙系统里那个系统拨号app是个安卓app
打印了几次activity的生命周期,发现鸿蒙的AbilitySlice都是在activity的onstart()方法之后运行,所以我尝试在activity的onResume方法里添加给activity添加几个控件…
运行结果
查看绘制布局,发现在activity渲染的是一个整体
断点分析后发现activity只有一个子控件:AGPContainerView,数据太多这里就不截图了
打印这个类和他的父类,发现AGPContainerView是一个SurfaceView
从这些信息大致可以推断出鸿蒙重新定义了一套新的ui api(ohos.agp.components包),那些承继自Component的控件,比如Text,Button,DirectionalLayout等都会在SurfaceView绘制
至于鸿蒙为什么要重新定义一套新的ui,那就不得而知了
作者:落花时节啃狗
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。