1.本书内容丰富,针对HarmonyOS 2.0,全面地介绍了鸿蒙2.0应用开发所涉及的知识点,使用概念介绍、代码编写、代码讲解的模式,将所讲的内容通过小案例用由浅入深、分步拆解的方式进行介绍,可以给你更好的学习体验。
2.作者权威,作者是华为认证的HarmonyOS系统课程开发者、华为开发者专家
4.4 跨设备启动服务
在HarmonyOS中,所有的功能都被抽象成Ability,服务被称作Service Ability,它不包含与用户进行交互的页面。比如,音乐播放器可以在退回到桌面后,依然播放音乐,这其实就是一种没有页面的服务。依托于HarmonyOS的分布式通信能力,开发者可以完成跨设备的服务启动,以便控制其他设备上的服务。首先来看一种最简单的使用方式:跨设备启动Service Ability。
跨设备启动服务和跨设备启动应用其实非常类似,需要申请ohos.permission.DISTRIBUTED_DATASYNC权限。当然,如果你需要查询网络中的分布式设备信息,那么还需要ohos.permission.GET_DISTRIBUTED_ DEVICE_INFO权限。
接下来完成一个跨设备启动Service Ability的案例。要完成这个案例,就需要以下几个步骤。
图4-14 创建SimpleServiceAbility
(1)权限配置。同4.2.2节的权限配置。
(2)通过DevEco Studio创建Service Ability,命名为SimpleServiceAbility,如图4-14所示。
(3)在ability_main.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">
......
<Button
ohos:id="$+id:start_service"
ohos:height="match_content"
ohos:width="match_parent"
ohos:text="启动远程服务"
ohos:top_margin="5vp"
ohos:background_element="#E1E1E1"
ohos:text_size="30fp"/>
</DirectionalLayout>
(4)在MainAbilitySlice中定义它的点击事件。
Button startService = (Button)findComponentById(ResourceTable.Id_ start_service);
startService.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
Intent intent = new Intent();
//配置Intent参数
Operation operation = new Intent.OperationBuilder()
.withDeviceId(deviceList.get(0).getDeviceId())
.withBundleName(getBundleName())
.withAbilityName(SimpleServiceAbility.class.getName())
.withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE).build();
intent.setOperation(operation);
intent.setParam("data","这是远程服务传来的消息!");
startAbility(intent);
}
});
这里的代码其实与远程启动FA是一样的,并没有区别。在上述代码中使用了deviceList.get(0).getDeviceId()方法获取设备ID,deviceList通过以下方式来获取。
List<DeviceInfo> deviceList = DeviceManager.getDeviceList (DeviceInfo.FLAG_GET_ONLINE_DEVICE);
由于Service Ability是没有页面的,为了方便看到效果,在Intent对象中传递了一个字符串。当启动远程服务后,开发者可以获取这个字符串,并给出提示,这样就能看出启动远程服务的效果。具体操作是在SimpleServicAbility的onCommand()方法中获取这个字符串,使用ToastDialog组件给出提示。
Ability为开发者提供了startAbility()方法来启动另一个Ability。由于不管是Feature Ability,还是Service Ability,都属于Ability的一种,所以也可以使用startAbility()方法来启动一个Service Ability。如果远程启动设备的Ability,那么只需要通过Operation对象的withDeviceId()方法来指定要启动的是哪一台设备上的Service Ability即可。
(5)重写SimpleServiceAbilty中的onCommand()方法。获取传递过来的字符串,并进行提示。
@Override
protected void onCommand(Intent intent, boolean restart, int startId) {
super.onCommand(intent, restart, startId);
String sdata = intent.getStringParam("data");
new ToastDialog(ctx).setText(sdata).show();
}
到这里,所有的代码都准备完成了,接下来将程序运行到模拟器上观察效果。首先获取分布式设备的信息,然后点击“启动远程服务”按钮,可以看到右侧设备已经弹出了消息提示,说明启动远程服务成功,如图4-15所示。
(a) (b)
图4-15 启动远程服务
这个时候,将右侧设备返回到桌面(将程序切换到后台),再次点击“启动远程服务”按钮,也是可以接收到消息的,如图4-16所示。
图4-16 后台运行的服务
这就是启动远程服务的例子,接下来介绍连接服务。它可以让多个设备之间建立一条通路,通过这条通路,可以实现以低延时在不同设备间进行数据交换。
第1章 HarmonyOS开篇 | 1
1.1 HarmonyOS概述 | 1
1.1.1 HarmonyOS技术特性 | 2
1.1.2 HarmonyOS架构 | 5
1.2 HarmonyOS环境搭建 | 7
1.2.1 DevEco Studio安装 | 7
1.2.2 SDK安装 | 10
1.2.3 HDC工具配置 | 17
1.2.4 账号注册与实名认证 | 21
1.3 HarmonyOS应用程序知识 | 25
1.3.1 App与HAP | 25
1.3.2 Ability概述 | 27
1.4 第一个程序:Hello World! | 27
1.4.1 创建项目 | 28
1.4.2 项目目录 | 31
1.4.3 配置文件 | 34
1.4.4 模拟器运行 | 36
1.4.5 应用签名与真机运行 | 45
1.4.6 自动签名 | 56
1.4.7 应用程序的断点调试 | 58
1.4.8 HiLog日志 | 63
1.5 本章小结 | 68
第2章 HarmonyOS页面开发 | 69
2.1 组件与组件容器 | 69
2.1.1 Component | 69
2.1.2 ComponentContainer | 70
2.1.3 开发用户页面的方式 | 71
2.1.4 边距 | 72
2.2 常用布局 | 76
2.2.1 DirectionalLayout | 76
2.2.2 DependentLayout | 89
2.2.3 StackLayout | 95
2.2.4 TableLayout | 98
2.2.5 PositionLayout | 105
2.2.6 AdaptiveBoxLayout | 106
2.3 常用组件 | 109
2.3.1 Component | 109
2.3.2 Text和TextField | 112
2.3.3 Button | 118
2.3.4 RadioButton和RadioContainer | 121
2.3.5 Checkbox | 129
2.3.6 Image | 131
2.3.7 ProgressBar和RoundProgressBar | 135
2.3.8 ToastDialog | 140
2.4 常用的资源类型 | 143
2.4.1 资源目录 | 143
2.4.2 资源文件的使用 | 144
2.4.3 限定词目录 | 153
2.4.4 样式与样式选择 | 155
2.5 动画开发 | 160
2.5.1 帧动画 | 160
2.5.2 数值动画 | 163
2.5.3 属性动画 | 168
2.6 组件的事件监听 | 171
2.6.1 事件类别 | 171
2.6.2 事件监听的五种写法 | 174
2.7 本章小结 | 180
第3章 Ability开发 | 181
3.1 Ability概述 | 181
3.2 Page Ability | 182
3.2.1 Page Ability的创建 | 183
3.2.2 Page Ability的生命周期 | 188
3.2.3 Page Ability的导航 | 191
3.3 Service Ability | 203
3.3.1 Service Ability的创建 | 203
3.3.2 Service Ability的生命周期 | 206
3.4 Ability属性配置 | 215
3.4.1 Ability的配置文件 | 215
3.4.2 Ability的启动模式 | 218
3.5 Intent | 220
3.5.1 Intent对象的结构 | 220
3.5.2 Intent对象的操作 | 221
3.6 本章小结 | 222
第4章 分布式通信 | 224
4.1 远程启动FA | 224
4.1.1 获取远程设备的信息 | 225
4.1.2 启动FA | 231
4.2 应用迁移 | 236
4.2.1 IAbilityContinuation接口 | 236
4.2.2 应用迁移案例 | 239
4.2.3 IAbilityContinuation接口的其他回调方法 | 243
4.3 应用回迁 | 246
4.4 跨设备启动服务 | 248
4.5 跨设备连接服务 | 252
4.6 跨设备服务调用 | 256
4.7 本章小结 | 264
第5章 数据管理 | 265
5.1 本地数据管理 | 265
5.1.1 关系型数据库与SQLite | 265
5.1.2 关系型数据库的操作 | 268
5.1.3 对象关系映射数据库 | 282
5.1.4 Preferences | 298
5.2 分布式数据管理 | 309
5.2.1 分布式数据服务 | 309
5.2.2 分布式数据服务开发 | 311
5.3 分布式文件服务 | 325
5.3.1 分布式文件服务概述 | 325
5.3.2 分布式文件服务开发 | 326
5.4 Data Ability | 333
5.4.1 Data Ability概述 | 333
5.4.2 Data Ability的创建 | 334
5.4.3 Data Ability的文件访问 | 338
5.4.4 Data Ability的数据库访问 | 345
5.5 本章小节 | 355
第6章 公共事件和通知 | 356
6.1 公共事件 | 357
6.1.1 公共事件发布 | 357
6.1.2 事件订阅 | 364
6.1.3 公共事件退订 | 369
6.2 通知 | 370
6.3 IntentAgent | 382
6.3.1 IntentAgent概述 | 382
6.3.2 IntentAgent开发 | 383
6.4 本章小结 | 390
第7章 服务卡片与原子化服务 | 391
7.1 卡片 | 391
7.1.1 创建卡片 | 394
7.1.2 卡片的开发 | 400
7.2 原子化服务 | 417
7.2.1 原子化服务概述 | 417
7.2.2 原子化服务开发 | 418
7.3 本章小结 | 422
第8章 高级编程 | 423
8.1 ListContainer | 423
8.1.1 ListContainer的使用 | 423
8.1.2 ListContainer的事件方法 | 430
8.2 ScrollView | 432
8.2.1 ScrollView的使用 | 432
8.2.2 ScrollView的事件方法 | 436
8.3 PageSlider与PageSliderIndicator | 439
8.3.1 PageSlider的使用 | 439
8.3.2 PageSlider的方法 | 445
8.3.3 PageSliderIndicator的使用 | 448
8.3.4 PageSliderIndicator的事件方法 | 454
8.4 WebView | 456
8.4.1 WebView的使用 | 456
8.4.2 WebView的事件方法 | 458
8.5 Fraction | 471
8.5.1 Fraction概述 | 471
8.5.2 Fraction的使用 | 473
8.6 本章小结 | 482
第9章 线程管理 | 483
9.1 线程管理开发 | 483
9.1.1 线程优先级 | 484
9.1.2 TaskDispatcher开发 | 484
9.2 线程间通信 | 497
9.2.1 EventHandler运行机制 | 498
9.2.2 线程间通信相关的对象 | 499
9.2.3 线程间通信开发 | 502
9.3 本章小结 | 510