HarmonyOS 鸿蒙Next用户选择服务卡片并创建后是否能通知到 App

发布于 1周前 作者 yuanlaile 来自 鸿蒙OS

HarmonyOS 鸿蒙Next用户选择服务卡片并创建后是否能通知到 App 目前我司 App 的服务卡片需要展示用户的车辆数据,应用内是在 FormExtensionAbilityonAddForm 中读取数据并向卡片同步数据更新 UI 的,这就导致用户在创建卡片时会有一个明显的数据调变的过程,是否有相关的生命周期能通知到 App 用户实际选择并将卡片放到桌面上了,能让 App 感知到当用户实际使用后才去刷新数据

2 回复

参考以下案例:

先存储卡片id,在主应用或者元服务页面中,首先从首选项中获取卡片id,然后调用formProvider.updateForm(formId,data) 给卡片发送数据。

参考代码如下:

1、存储卡片id:

在卡片添加到页面时,我们可以在FormExtensionAbility中的onAddForm生命周期中将卡片id存储到首选项中,在应用或者元服务页面中就可以通过首选项来获取卡片id了。

import formInfo from '@ohos.app.form.formInfo';
import formBindingData from '@ohos.app.form.formBindingData';
import { FormExtensionAbility } from '@ohos.app.form.FormExtensionAbility';
import { PreferencesUtil } from '../common/PreferencesUtil';

export default class EntryFormAbility extends FormExtensionAbility {

onAddForm(want) {
let formData = {
    title:'鸿蒙雄起',
    desc:'鸿蒙千帆起,我要当舵手'
};

// 1. 获取卡片id
let formId = want.parameters[formInfo.FormParam.IDENTITY_KEY];

//2. 将卡片id保存到首选项
PreferencesUtil.getInstance().addFormId(this.context,formId);

// 2. 将数据转为卡片识别的对象返回
return formBindingData.createFormBindingData(formData);
}
};

在上面的代码中,用到了PreferencesUtil这个工具类,其实现如下:

import dataPreferences from '@ohos.data.preferences';
import { Logger } from '@ohos.hilog';

const TAG = 1;
const MY_STORE = 'myStore';
const FORM_ID = 'formIds';

type ValueType = number | string | boolean | Array<number> | Array<string> | Array<boolean>;

export class PreferencesUtil {

private static preferencesUtil: PreferencesUtil;

public static getInstance(): PreferencesUtil {
if (!PreferencesUtil.preferencesUtil) {
    PreferencesUtil.preferencesUtil = new PreferencesUtil();
}

return PreferencesUtil.preferencesUtil;
}

getPreferences(context: Context): Promise<dataPreferences.Preferences> {
return new Promise((resolve, reject) => {
dataPreferences.getPreferences(context, MY_STORE, (err, pref: dataPreferences.Preferences) => {
    if (err) {
        Logger.error(TAG, `Failed to get preferences. Code:${err.code},message:${err.message}`);
        reject(err);
        return;
    }

    resolve(pref);
})
})
}

preferencesFlush(preferences: dataPreferences.Preferences) {
preferences.flush((err) => {
    if (err) {
        Logger.error(TAG, `Failed to flush. Code:${err.code}, message:${err.message}`);
    }
})
}

preferencesPut(preferences: dataPreferences.Preferences, formIds: Array<string>): Promise<boolean> {
return new Promise((resolve, reject) => {
try {
    preferences.put(FORM_ID, formIds, (err) => {
        if (err) {
            reject(err);
            Logger.error(TAG, `Failed to put data. Code:${err.code}, message:${err.message}`);
            return;
        }

        Logger.info(TAG, `preferencesPut succeed,formIds: ${JSON.stringify(formIds)}`);
        resolve(true);
    })
} catch (error) {
    Logger.error(TAG, `Failed to put data. Code: ${error.code},
message:${error.message}`);
}
});

}

async preferencesHas(preferences: dataPreferences.Preferences): Promise<boolean> {
return new Promise((resolve, reject) => {
preferences.has(FORM_ID, (err, value) => {
    if (err) {
        reject(err);
        Logger.error(TAG, `WANG to check the key 'formIds'. Code:${err.code}, message:${err.message}`);
        return;
    }

    resolve(value);
});
})

}

removePreferencesFromCache(context: Context): void {
dataPreferences.removePreferencesFromCache(context, MY_STORE);
}

async getFormIds(context: Context): Promise<Array<string>> {
try {
    let preferences = await this.getPreferences(context);

    return new Promise((resolve, reject) => {
        if (preferences === null) {
            Logger.error(TAG, `preferences is null`);
            return;
        }

        preferences.get(FORM_ID, [''], (err, value: ValueType) => {
            if (err) {
                reject(err);
                Logger.error(TAG, `Failed to get value of 'formIds'. Code:${err.code}, message:${err.message}`);
                return;
            }

            resolve(value as Array<string>);
            Logger.info(TAG, `Succeeded in getting value of 'formIds'. val: ${value}.`);
        })
    })
} catch (error) {
    Logger.error(TAG, `WANG Failed to get value of 'formIds'. Code:${error.code},
message:${error.message}`);
}

return new Promise((resolve, reject) => {});

}

async addFormId(context: Context, formId: string) {
try {
    let preferences = await this.getPreferences(context);

    if (preferences === null) {
        Logger.error(TAG, `preferences is null`);
        return;
    }

    if (await this.preferencesHas(preferences)) {
        let formIds = await this.getFormIds(context);

        console.log('formIds:',formIds)

        if (formIds.indexOf(formId) === -1) {
            formIds.push(formId);

            if (!await this.preferencesPut(preferences, formIds)) {
                return;
            }

            this.preferencesFlush(preferences);
        }
    } else {
        if (!await this.preferencesPut(preferences, [formId])) {
            return;
        }

        this.preferencesFlush(preferences);
    }
} catch (error) {
    Logger.error(TAG, `Failed to check the key 'formIds'. Code:${error.code},
message:${error.message}`);
}

}

async removeFormId(context: Context, formId: string) {
try {
    let preferences = await this.getPreferences(context);

    if (preferences === null) {
        Logger.error(TAG, `preferences is null`);
        return;
    }

    if (await this.preferencesHas(preferences)) {
        let formIds = await this.getFormIds(context);

        let index = formIds.indexOf(formId);

        if (index !== -1) {
            formIds.splice(index, 1);
        }

        if (!await this.preferencesPut(preferences, formIds)) {
            return;
        }

        this.preferencesFlush(preferences);
    }
} catch (error) {
    Logger.error(TAG, `WANG Failed to get preferences. Code:${error.code},
message:${error.message}`);
}

}
}

2、应用/元服务页面中发送数据

在主应用或者元服务页面中,首先从首选项中获取卡片id,然后调用formProvider.updateForm(formId,data) 给卡片发送数据。

async aboutToAppear() {
// 1. 从首选项获取卡片id
let cardids = await PreferencesUtil.getInstance().getFormIds(getContext(this));

// 2. 遍历卡片id,更新卡片数据
let data = {
    title: '鸿蒙雄起- 主应用推送刷新'+Math.random(),
    desc: '鸿蒙千帆起,我要当舵手-主应用推送刷新'+Math.random()
};

cardids.forEach(cardid => {
    let bindData = formBindingData.createFormBindingData(data);
    formProvider.updateForm(cardid, bindData)
    .then(res => {
        console.log('mylog',JSON.stringify(res))
    })
    .catch(err => {
        console.log('mylog','err',JSON.stringify(err))
    })
})
}

3、卡片页面接收数据

在卡片WidgetCard.ets中通过localStorageProp接收数据。首先在WidgetCard.ets文件的最上面创建一个LocalStorage的实例,然后将实例传递给@Entry,在页面中就可以使用LocalStorageProp修饰符来接收数据了。

更多关于HarmonyOS 鸿蒙Next用户选择服务卡片并创建后是否能通知到 App的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,当用户选择并创建一个服务卡片后,系统确实有能力通知到对应的App。这一机制主要依赖于鸿蒙系统的服务框架和事件分发系统。

具体来说,当用户通过桌面或负一屏等界面选择并添加一个服务卡片时,系统会记录这一操作,并通过内部通信机制(如Intent、消息总线等,但非Java或C语言层面的直接调用)将这一事件通知给相应的App。App接收到这一通知后,可以执行相应的逻辑,比如更新数据、调整界面状态等,以确保服务卡片显示的内容是最新的且与App内部状态同步。

这一过程是鸿蒙系统为了提升用户体验和服务连续性而设计的一部分,它允许App与用户之间建立更加紧密和动态的交互关系。

需要注意的是,这一通知机制的具体实现细节可能因鸿蒙系统的不同版本和App的开发方式而有所差异。但总体上,鸿蒙系统确实提供了这样的能力,以确保App能够及时响应用户对服务卡片的操作。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部