ohos:text_size="50"/>
也可以通过Java代码直接创建,点击事件都是如此的亲切
@Override public void onStart(Intent intent) { super.onStart(intent); // 步骤1 声明布局 DirectionalLayout directionalLayout = new DirectionalLayout(context); // 步骤2 设置布局大小 directionalLayout.setWidth(ComponentContainer.LayoutConfig.MATCH_PARENT); directionalLayout.setHeight(ComponentContainer.LayoutConfig.MATCH_PARENT); // 步骤3 设置布局属性及ID(ID视需要设置即可) directionalLayout.setOrientation(Component.VERTICAL); directionalLayout.setPadding(32, 32, 32, 32);
Text text = new Text(context); text.setText("My name is Text."); text.setTextSize(50); text.setId(100); // 步骤4.1 为组件添加对应布局的布局属性 DirectionalLayout.LayoutConfig layoutConfig = new DirectionalLayout.LayoutConfig(LayoutConfig.MATCH_CONTENT, LayoutConfig.MATCH_CONTENT); layoutConfig.alignment = LayoutAlignment.HORIZONTAL_CENTER; text.setLayoutConfig(layoutConfig);
// 步骤4.2 将Text添加到布局中 directionalLayout.addComponent(text);
// 类似的添加一个Button Button button = new Button(context); layoutConfig.setMargins(0, 50, 0, 0); button.setLayoutConfig(layoutConfig); button.setText("My name is Jackie."); button.setTextSize(50); button.setId(100); ShapeElement background = new ShapeElement(); background.setRgbColor(new RgbColor(0, 125, 255)); background.setCornerRadius(25); button.setBackground(background); button.setPadding(10, 10, 10, 10); button.setClickedListener(new Component.ClickedListener() { @Override // 在组件中增加对点击事件的检测 public void onClick(Component Component) { // 此处添加按钮被点击需要执行的操作 } }); directionalLayout.addComponent(button);
// 步骤5 将布局作为根布局添加到视图树中 super.setUIContent(directionalLayout); }
首页的布局如下,通过Java代码创建
@Override public void onStart(Intent intent) { super.onStart(intent); System.out.println("onStart"); LayoutConfig config = new LayoutConfig(LayoutConfig.MATCH_PARENT, LayoutConfig.MATCH_PARENT); myLayout.setLayoutConfig(config); ShapeElement element = new ShapeElement(); element.setRgbColor(new RgbColor(255, 255, 255)); myLayout.setBackground(element);
Text text = new Text(this); text.setLayoutConfig(config); text.setText("CT Jackie"); text.setTextColor(new Color(0xFF000000)); text.setTextSize(50); text.setTextAlignment(TextAlignment.CENTER); myLayout.addComponent(text); super.setUIContent(myLayout); }
效果如下:
2.生命周期
下面再来看看主界面的生命周期,实现了ILifecycle接口,生命周期状态一共有七种
public static enum Event { UNDEFINED, ON_START, ON_INACTIVE, ON_ACTIVE, ON_BACKGROUND, ON_FOREGROUND, ON_STOP; private Event() { } }
界面启动时调用onStart()和onActive()
2020-09-13 21:42:10.266 25547-25547[表情] I/System.out: onStart 2020-09-13 21:42:10.284 25547-25547[表情] I/System.out: onActive
点击返回键时调用
2020-09-13 21:42:35.847 25547-25547/com.example.helloworld I/System.out: onInactive 2020-09-13 21:42:35.917 25547-25547/com.example.helloworld I/System.out: onBackground 2020-09-13 21:42:35.920 25547-25547/com.example.helloworld I/System.out: onStop
至于UNDEFINED和ON_FOREGROUND暂时还不了解。
3.Gradle任务(Task)
甚至连gradle的Task都非常类似,打包命令是assembleDebug/Release
Task :entry:preBuild Task :entry:compileDebugNativeWithCmake Task :entry:collectDebugDependencies Task :entry:mergeDebugResources Task :entry:mergeDebugProfile Task :entry:compileDebugResources Task :entry:compileDebugIdl Task :entry:compileDebugRFile Task :entry:processDebugJavaResource Task :entry:compileDebugJavaWithJavac Task :entry:mergeDebugJavaResource Task :entry:generateDebugClassesJar Task :entry:mergeDebugProjectDex Task :entry:generateDebugShell Task :entry:processDebugShellManifest Task :entry:compileDebugShellResources Task :entry:linkDebugShellResources Task :entry:compileDebugShellJavaWithJavac Task :entry:mergeDebugShellDex Task :entry:packageDebugShell Task :entry:packageDebugSimplifyShell Task :entry:validateDebugSigning Task :entry:signDebugShell Task :entry:packageDebugHap Task :entry:signDebugHap Task :entry:assembleDebug
4.配置文件
配置文件是一个命名为config.json的文件,配置应用的一些信息
{ "app": { "bundleName": "com.example.helloworld", "vendor": "example", "version": { "code": 1, "name": "1.0" }, "apiVersion": { "compatible": 3, "target": 3 } }, "deviceConfig": { "default": {
} }, "module": { "package": "com.example.helloworld", "name": ".HelloWorld", "reqCapabilities": [ "video_support" ], "deviceType": [ "wearable" ], "distro": { "deliveryWithInstall": true, "moduleName": "entry", "moduleType": "entry" }, "abilities": [ { "skills": [ { "entities": [ "entity.system.home" ], "actions": [ "action.system.home" ] } ], "orientation": "landscape", "formEnabled": false, "name": "com.example.helloworld.MainAbility", "icon": "string:mainability_description", "label": "HelloWorld", "type": "page", "launchType": "standard" } ] } }
仔细看这个文件会越来越觉得这就是AndroidManifest.xml的json翻译版。
反编译角度看鸿蒙
既然看起来这么像安卓,我看来看看它编译后的产物是什么,是不是也能像android一样反编译得到dex文件?
编译后得到的是一个xxx.hap文件
修改它的后缀名为.zip,解压后可以看到里面有熟悉的assets,dex,apk文件等,把这个apk文件安装后发现并不能使用。
下面我们先反编译这个classes.dex文件第一个dex反编译后出现错误
~/Desktop/fanbianyi/dex2jar-2.0 » sh d2j-dex2jar.sh classes3.dex dex2jar classes3.dex -> ./classes3-dex2jar.jar com.googlecode.d2j.DexException: not support version. at com.googlecode.d2j.reader.DexFileReader.(DexFileReader.java:151) at com.googlecode.d2j.reader.DexFileReader.(DexFileReader.java:211) at com.googlecode.dex2jar.tools.Dex2jarCmd.doCommandLine(Dex2jarCmd.java:104) at com.googlecode.dex2jar.tools.BaseCmd.doMain(BaseCmd.java:288) at com.googlecode.dex2jar.tools.Dex2jarCmd.main(Dex2jarCmd.java:32)
原因是我们的工具版本太低了,解决方案在这,升级版本后反编译成功后为classes3-dex2jar.jar,打开可以看到
这里多了个ResourceTable文件,就是我们的资源id表。这里的dex文件包含的是我们开发的代码。
下面我们来反编译apk文件,解压后可以看到,里面是我们熟悉的内容
AndroidManifest.xml文件如下
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!