PS:学习B站全网首套鸿蒙HarmonyOS 2.0应用开发实战教程 的笔记
地址:B站全网首套鸿蒙HarmonyOS 2.0应用开发实战教程
《锋迷商城》HarmonyOS应⽤开发
移动应⽤开发:

HarmonyOS有三⼤特征:

盘古开天辟地——⼀⽚混沌(鸿蒙时代) ⽴志要在⼿机系统的国产化道路上开天辟地
安卓:应⽤的运⾏是基于虚拟机的 (Java—JDK编译器—字节码—虚拟机—操作系统)
鸿蒙:⽅⾈编译器 (Java----⽅⾈编译器—机器码—操作系统)
据说, 鸿蒙系统运⾏效率相较于安卓提升了50%+
下载地址
华为操作系统DevEco Studio和SDK下载与升级 | HarmonyOS开发者
安装
运行DevEco Studio
第一次启动开发环境会下载鸿蒙开发所需要的SDK





config.json 是鸿蒙应⽤的主配置⽂件
app 配置 :定义当前应⽤的唯⼀标识
module 配置: ⽤于声明当前应⽤的信息(包、主类、主界⾯、功能模块声明、适配设 备类型等等)
mainAbility声明当前应用启动时默认加载的Ability
deviceType声明当前应用适配的设备类型
abilities 声明当前应⽤中每个ability的配置信息


启动鸿蒙应⽤加载config.json⽂件,根据 mainAbility配置加载启动应⽤的主界⾯
"mainAbility": "com.example.myapplication.demo01.MainAbility"
执⾏MainAbility的 onStart ⽅法
MainAbility是⼀个显示界⾯的容器,在onStart⽅法中通过调⽤ setMainRoute ⽅法来指 定当前界⾯容器中显示的视图界⾯
// ability相当于一个容器(或者说是浏览器窗口),
// 在容器里面通过填充一个视图slice(html中的body)来展示。
// MainAbilitySlice就是⼀个界⾯
super.setMainRoute(MainAbilitySlice.class.getName());
执⾏MainAbilitySlice中的 onStart 完成界⾯的渲染
slice是⼀个界⾯,界⾯中显示什么视图,就是通过onstart⽅法来加载渲染的



$string : 表示引用的一sing,表示要去string文件中寻找键值对,如图寻找key为:mainability_HelloWorld 的值。
Ability是应⽤所具备能⼒的抽象,也是应⽤程序的重要组成部分。⼀个应⽤可以具备多种能⼒
(即可以包含多个Ability),HarmonyOS⽀持应⽤以Ability为单位进⾏部署。
Ability可以分为FA(Feature Ability) 和PA (Particle Ability) 两种类型,每种类型为
开发者提供了不同的模板,以便实现不同的业务功能。
FA⽀持Page Ability:
Page模板是FA唯⼀⽀持的模板,⽤于提供与⽤户交互的能⼒。⼀个Page实例可以包含⼀组相关⻚⾯,每个⻚⾯⽤⼀个AbilitySlice实例表示。

PA⽀持Service Ability和Data Ability:

⼀个PageAbility相当于⼀个⻚⾯的容器(浏览器窗⼝),⼀个AbilitySlice相当于显示在容器
中的⼀个⻚⾯(HTML)
Page模板(以下简称“Page”)是FA唯⼀⽀持的模板,⽤于提供与⽤户交互的能⼒。
⼀个Page可以由⼀个或多个AbilitySlice构成,AbilitySlice是指应⽤的单个⻚⾯及其控制逻辑的总和(相当于⼀个HTML⽂件)。在⼀个Abiliy种可以包含多个Slice
商品管理: ProductAbility(PageAbility):
goods-list.html ProductListSlice
goods-detail.html ProductDetailSlice
AbilitySlice创建slice包中
创建步骤:
创建⼀个类继承 ohos.aafwk.ability.AbilitySlice 类
public class MainAbilitySlice2 extends AbilitySlice {
}
在 resources/base/layout ⽬录下创建布局⽂件
<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical">
<Text
ohos:height="match_content"
ohos:width="match_content"
ohos:text="这是测试⽂本"
ohos:text_color="#ff0000"
ohos:text_size="40vp"></Text>
</DirectionalLayout>
在创建的 AbilitySlice 类中重写 onStart ⽅法,调⽤setUIContent⽅法加载布局⽂件
通过 ResourceTable 加载resouces⽬录下的资源
public class MainAbilitySlice2 extends AbilitySlice {
@Override
protected void onStart(Intent intent) {
super.onStart(intent);
//定义slice视图组件(Java,XML)
//setUIContent(int); 加载应⽤的 布局⽂件(xml) 作为当前slice的视图
setUIContent(ResourceTable.Layout_ability_main_slice2);
}
}
⼀个Page中可以包含多个Slice,但是只能同时显示⼀个slice,如何设置PageAbility默认
显示的slice?
在⼀个Page Ability中提供了多个声明周期⽅法,这些⽅法在当前PageAbility加载的不同
阶段会⾃定调⽤

说明
INACTIVE状态是一种短暂存在的状态,可理解为“激活中”。
public class MainAbility extends Ability {
/**
* 当系统⾸次创建当前PageAbility实例时,⾃动调⽤onstart⽅法。也就是说对于⼀个Page⽽⾔,onStart⽅法只会执⾏⼀次
*/
public void onStart(Intent intent) {
super.onStart(intent);
super.setMainRoute(MainAbilitySlice2.class.getName());
System.out.println("--------------onStart");
}
/**
* 当前Page进⼊active状态进⼊到⼿机前台获取焦点时,会触发onActive⽅法的执⾏
*/
protected void onActive() {
super.onActive();
System.out.println("--------------onActive");
}
/**
* 当前PageAbility失去焦点(⻚⾯切⼊到后台、切换到其他Page),触发onInactive⽅法的执⾏
*/
protected void onInactive() {
super.onInactive();
System.out.println("--------------onInactive");
}
/**
* 当前PageAbility切换到后台,不可⻅时,触发onBackground执⾏
*/
protected void onBackground() {
super.onBackground();
System.out.println("--------------onBackground");
}
/**
* 当PageAbility从后台不可⻅状态(⻚⾯在后台、但是没销毁)切换到前台可⻅状态时触发 onForeground执⾏
*/
protected void onForeground(Intent intent) {
super.onForeground(intent);
System.out.println("--------------onForeground");
}
/**
* 当前Page销毁时,触发onStop的执⾏
*/
protected void onStop() {
super.onStop();
System.out.println("--------------onStop");
}
}
Slice相当于一个网页,Slice中显示的视图是通过组件来声明的,Slice中的组件加载支持两种方式:
- Java代码
- xml布局文件
onStart方法:在Slice实例创建时执行,用于载入当前Slice的视图组件,在onStart方法中通过调用setUIContext来加载视图组件
setUIContext方法提供了2个重载:
setUIContext(int):通过布局⽂件的ID,加载resources/base/layout⽬录下的布局⽂件
完成⻚⾯的渲染
setUIContext(ComponentContainer) :通过加载⼀个使⽤Java代码创建的组件完成⻚⾯
的渲染
创建布局⽂件:ability_main_slice2.xml
<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical">
<Text
ohos:height="match_content"
ohos:width="match_content"
ohos:text="这是测试文本"
ohos:text_color="#ff0000"
ohos:text_size="40vp"></Text>
</DirectionalLayout>
在Slice的onStart⽅法中加载布局⽂件:
每创建一个布局文件(或者说每个资源都会创建一个ID)都会生成一个ID,所以布局文件调用的是setUIContext(int)方法

@Override
protected void onStart(Intent intent) {
super.onStart(intent);
// 定义slice视图组件(java,xml)
// setUIContent(int); 加载应用的 布局文件(xml)作为当前slice的试图
super.setUIContent(ResourceTable.Layout_ability_main_slice2);
}
使⽤Java代码创建组件,渲染到slice中
public class MainAbilitySlice2 extends AbilitySlice {
@Override
protected void onStart(Intent intent) {
super.onStart(intent);
// 定义slice视图组件(java,xml)
// setUIContent(int); 加载应用的 布局文件(xml)作为当前slice的试图
// super.setUIContent(ResourceTable.Layout_ability_main_slice2);
// ComponentContainer(组件容器)
DirectionalLayout directionalLayout = new DirectionalLayout(this);
directionalLayout.setOrientation(Component.DRAG_VERTICAL);
// Component(组件)
Text text = new Text(this);
text.setText("Hello Boys");
text.setHeight(40);
text.setTextSize(40);
// 将组件放到组件容器中
directionalLayout.addComponent(text);
// 将组件容器渲染到slice中
setUIContent(directionalLayout);
}
}
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain