支持提供特定功能的免安装的应用
(即原子化服务
)。定义和优点
原子化卡片的开发方法
和服务分享的开发方法
。面向未来的服务提供方式
,是有独立入口的(用户可通过点击方式直接触发)、免安装的(无需显式安装,由系统程序框架后台安装后即由1个或多个HAP包组成
,1个HAP包对应1个FA或1个PA。每个FA或PA均可独立运行,完成1个特定功能;1个或多个功能(对应FA或PA)完成1个特定的便捷服务。服务发现
:原子化服务可在服务中心发现并使用
;智能推荐
:原子化服务可以基于合适场景被主动推荐给用户使用
,或在服务中心发现。免安装使用
;服务卡片
:支持用户无需打开原子化服务便可获取服务内重要信息的展示和动态变化
。支持运行在1+8+N设备上
,如手机、平板等设备;支持跨设备分享
:例如接入华为分享后,用户可分享原子化服务给好友;支持跨端迁移和协同
。查看
、搜索
、收藏
和管理功能
。原子化服务流转的触发方式有系统推荐流转
和用户手动流转
。
系统推荐流转
:用户使用应用程序时,所处环境中存在使用体验更优的可选设备,则系统自动用户手动流转
:用户可以手动选择合适的设备进行流转
。用户点击图标后,会调起系统提供的流转面板。面板中会展示出用户应用程序的信息及可流转的设备,引导用户进行后续的流转操作。流转的技术方案
跨端迁移
:指在A端运行的用户应用程序,迁移到B端上并从迁移时刻A端状态继续运行,然后A端用户应用程序退出;
多端协同
:指多端上的不同FA/PA同时运行、或者接替运行实现完整的业务。或者多端上的相同FA/PA同时运行实现完整的业务。
通过分享的方式,将原子化服务分享到其它设备上
,用户确认后可直接免安装启动服务。用户可在原子化服务内选择分享,打开“华为分享”开关后,将原子化服务分享给附近同样打开了“华为分享”开关的好友,好友点击确认后直接启动服务。新浪新闻服务分享
服务卡片
(以下简称“卡片”)是FA的一种界面展示形式,将FA的重要信息或操作前置到卡片,以达到服务直达,减少体验层级的目的。卡片常用于嵌入到其他应用
(当前只支持系统应用)中作为其界面的一部分显示,并支持拉起页面,发送消息等基础的交互功能。服务卡片包含以下三部分:
卡片提供方
:提供卡片显示内容的HarmonyOS应用或原子化服务,控制卡片的显示内容、控件布局以及控件点击事件;卡片使用方
:显示卡片内容的宿主应用,控制卡片在宿主中展示的位置;卡片管理服务
:用于管理系统中所添加卡片的常驻代理服务,包括卡片对象的管理与使用,以及卡片周期性刷新等。数据绑定
:JS页面中的数据绑定是体现在.js文件中
,而JS卡片中的数据绑定是体现到.json文件
中,这是最主要区别。事件绑定
:卡片仅支持click通用事件
,事件的定义只能是直接命令式
,事件定义必须包含action字段
,用以说明事件类型。卡片支持两种事件类型:跳转事件(router)和消息事件(message)。
跳转事件
可以跳转到卡片提供方的应用
;消息事件
可以将开发者自定义信息传递给卡片提供方
。跳转事件中若定义了params字段
,则在被拉起应用的onStart()回调
的intent参数
中,可用“params”作为key将跳转事件定义的params字段的值取到。应用资源
“@app.type.resource_id”
的形式引用应用资源;“{{$r('app.type.resource_id')}}”
的形式引用应用资源,各个字段的含义与css文件相同。系统资源
引用系统预置资源
,包括颜色、圆角和图片类型的资源。在卡片工程的css文件中,通过“@sys.type.resource_id”
的形式引用系统资源。<div class="container-inner">
<text class="title" style="backgroundcolor:{{$r('app.color.my_background_color')}}">{{ $t('strings.title') }}text>
<text class="detail_text" style="backgroundcolor:{{$r('app.color.my_foreground_color')}}">{{ $t('strings.detail') }}text>
div>
{
"color": [
{
"name": "my_background_color",
"value": "#ffff0000"
},
{
"name": "my_foreground_color",
"value": "#ff0000ff"
}
]
}
创建成功后,在config.json的module中会生成js模块,用于对应卡片的js相关资源。
"js": [
{
"pages": [
"pages/index/index"
],
"name": "widget",
"window": {
"designWidth": 720,
"autoDesignWidth": true
},
"type": "form"
}
]
"forms": [
{"jsComponentName": "widget",
"isDefault": true,
"scheduledUpdateTime": "10:30",
"defaultDimension": "2*2",
"name": "widget",
"description": "This is a service widget",
"colorMode": "auto",
"type": "JS",
"supportDimensions": [
"2*2"],
"updateEnabled": true,
"updateDuration": 1
}],
"launchType": "standard"
} ],
新建卡片
卡片内容刷新
卡片页面跳转
卡片消息传递
卡片事件触发
定义了一个点击事件
:<div class="container" onclick="routerEvent">
该事件会激发json文件中的routerEvent回调事件
,定义在action对象中
"actions": {
"routerEvent": {
"action": "router",
"bundleName": "ohos.samples.jsfacard",
"abilityName": "ohos.samples.jsfacard.ClockAbility",
"params": {
"message": "add detail"
}
}
<div class="container" onclick="activeEvent"> div>
{
"data": {},
"actions": {
"activeEvent": {
"action": "message",
"bundleName": "ohos.samples.jsfacard",
"abilityName":
"ohos.samples.jsfacard.MainAbility",
"params": {
"message": "jscardtemplate add detail"
}
} }}
@Override protected void onTriggerFormEvent(long
formId, String message) {
LogUtils.info(TAG, "onTriggerFormEvent:
messgeage=" + message);
super.onTriggerFormEvent(formId, message);
......
}
卡片事件的触发是指在卡片中的点击事件引发卡片上数据的变化
,该过程就等于卡片消 息传递
+卡片内容刷新
。
<image src="/common/{{status}}.svg" onclick="messageEvent" class="status-image">image>
@Override protected void onTriggerFormEvent(long formId, String message) {
ZSONObject zsonObject = new ZSONObject();
if (isStatus) {
zsonObject.put(STATUS, PAUSE);
isStatus = false;
} else {
zsonObject.put(STATUS, PLAY);
isStatus = true;
}
FormBindingData formBindingData = new FormBindingData(zsonObject);
updateForm(formId, formBindingData);
}
便捷服务
,可以通过接入华为分享实现近距离快速分享
,使便捷服务可以精准快速的推送至接收方,降低用户触达服务的成本,提升用户体验。相比于传统的社交软件分享接收方无需提前安装承载服务的安装包,即可享受原生的服务体验。服务端使用ServiceStub接口
,客户端使用CallbackProxy接口
,即“代理-桩”模式。服务分享方为服务端,服务接收方为客户端。集成IDL接口
,用于建立分享方与华为分享的交互通道,完成后续服务分享过程。
ShareFaManager类
,用于管理分享方与华为分享的连接通道和数据交互public class ShareFaManager {
private final IAbilityConnection mConnection = new IAbilityConnection() {
@Override
public void onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, int i) {
mHandler.postTask(()->{mShareService = new HwShareServiceProxy(iRemoteObject);}
}
@Override
public void onAbilityDisconnectDone(ElementName elementName, int i) {}
}
private final HwShareCallbackStub mFaCallback = new HwShareCallbackStub("HwShareCallbackStub") { @Override
public void notifyState(int state) throws RemoteException {
mHandler.postTask(()->{if (mSharePacMap != null) {shareFaInfo(); } }}
public static synchronized ShareFaManager getInstance(Context context) {}
public void shareFaInfo(String appId, PacMapEx pacMap) {
mAppId = appId;
mSharePacMap = pacMap;
mHandler.removeTask(mTask);
shareFaInfo();
bindShareService();
}
private void bindShareService() {
Intent intent = new Intent();
Operation operation = new Intent.OperationBuilder()
.withDeviceId("")
.withBundleName(SHARE_PKG_NAME)
.withAction(SHARE_ACTION)
.withFlags(Intent.FLAG_NOT_OHOS_COMPONENT)
.build();
intent.setOperation(operation);
mContext.connectAbility(intent, mConnection);
}
封装服务分享数据,调用ShareFaManager封装的接口
完成服务的分享。
PacMapEx pacMap = new PacMapEx();
...
pacMap.putObjectValue(ShareFaManager.HM_BUNDLE_NAME, getBundleName());
...
pacMap.putObjectValue(ShareFaManager.HM_FA_NAME, "FAShareDemo");
ShareFaManager.getInstance(ClockAbilitySlice.this).shareFaInfo("728380991055342400", pacMap);
原子化服务的定义与特性
;接着描述了原子化服务在HarmonyOS系统中的多种应用场景
;然后介绍了原子化服务开发的要求和运作机制
,服务方的主要回调函数
等。卡片项目的结构
,资源访问方式
和配置文件配置过程
。最后本章用一个详细的卡片项目案例
将前面的知识点进行了综合应用,并展示了卡片内容刷新
,事件交互
和页面路由
的实现方法;原子化分享功能
也集成到卡片项目中果
[外链图片转存中…(img-c3Zz6LyN-1643194887413)]
原子化服务的定义与特性
;接着描述了原子化服务在HarmonyOS系统中的多种应用场景
;然后介绍了原子化服务开发的要求和运作机制
,服务方的主要回调函数
等。卡片项目的结构
,资源访问方式
和配置文件配置过程
。最后本章用一个详细的卡片项目案例
将前面的知识点进行了综合应用,并展示了卡片内容刷新
,事件交互
和页面路由
的实现方法;原子化分享功能
也集成到卡片项目中