HarmonyOS鸿蒙Next中问2个权限的问题
HarmonyOS鸿蒙Next中问2个权限的问题 1,app有代理通知,在系统重启后不手动打开app如何让代理通知正常提醒? 2,app不在后台或者前台运行时,如何监听蓝牙状态?或者说蓝牙断开怎么样自动唤醒app
尊敬的开发者您好,
1、发布代理提醒之后,就算应用重启,或者退至后台或进程终止后,到达设置的时间之后,代提提醒依旧会提醒。 这边是重启以后之前设置的代理提醒不生效了吗? 2、应用不能再进程完全不存在时长期监听蓝牙状态并自动唤醒app。建议使用BLUETOOTH_INTERACTION长时任务来保持后台任务,不过需要注意:申请长时任务后,系统会进行校验,确保应用确实在执行对应的蓝牙任务。同时,系统会关联一个通知栏消息,用户删除该通知会触发系统自动停止长时任务,详见约束与限制。如果一定要在后台被关闭的情况下监听蓝牙状态麻烦提供下目前是一个什么样的业务场景需要。
更多关于HarmonyOS鸿蒙Next中问2个权限的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
我查到代理提醒在手机系统重启后是失效的,现在还没测试呢,因为如果重启后失效完全就没有开发的必要了。另外蓝牙监控其实自带的智慧生活也可以,但是要解锁屏幕才行。其实只要系统更新两个功能就完全没必要开发了。第一个是轮班(倒班)闹钟,第二个是安卓和ios上的自动化任务,目前测试小艺自动化和智慧生活都是有限制的。
开发者您好
1.这边查到代理提醒在手机系统重启后是失效的,这个文档是在哪里看到的,手机重启后代理提醒是不会失效的。
2.这边智慧生活是使用了场景模式是吧?这边是需要在锁屏状态下在关闭蓝牙的时候还能打开应用是吗?如果用户设置了指纹密码也需要强行打开这样?
找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17,
针对你的场景(代理通知 + 蓝牙断开唤醒),推荐组合:
通知提醒 :使用 ReminderAgentManager(系统级保障,重启不丢)
蓝牙监听 :使用 CommonEvent 订阅(应用存活时实时响应)
断开唤醒:在 CommonEvent 回调中调用 startAbility 拉起应用,同时补发一条通知确保用户感知
- 系统重启后代理通知的自动恢复
鸿蒙的后台代理提醒服务(Reminder Agent)本身具备系统托管能力:应用发布提醒后,系统会持久化提醒任务并接管触发逻辑,即使应用未运行或设备重启,只要提醒未过期,系统仍会按时触发通知。
但需确保以下配置:
权限声明:在 module.json5 中正确声明 ohos.permission.PUBLISH_AGENT_REMINDER 权限。
提醒参数持久化:
若提醒目标时间基于相对时间(如“10分钟后提醒”),系统重启后可能因计时中断导致提醒失效。建议:
使用绝对时间(如日历提醒)而非倒计时。
在应用首次启动时,通过系统事件(如commonEvent.SystemReady)检测重启,并重新发布未执行的提醒。
- 应用未运行时监听蓝牙状态
鸿蒙提供了**系统级事件订阅机制,但应用完全退出(非后台运行)时,默认无法主动监听蓝牙事件。以下是替代方案:
方案一:使用系统通用事件(Common Event)
通过订阅系统广播事件(如蓝牙连接状态变化),在事件触发时拉活应用:
// 订阅蓝牙连接状态变化事件(需申请蓝牙权限)
import commonEvent from '@ohos.commonEventManager';
commonEvent.createSubscriber({
events: ["usual.event.bluetooth.device.CONNECT_STATE_CHANGED"]
}, (err, subscriber) => {
commonEvent.subscribe(subscriber, (err, data) => {
// 解析事件数据,判断设备断开连接
if (data?.deviceState === 'DISCONNECTED') {
// 触发通知或唤醒应用(需配置后台启动权限)
}
});
});
限制:
- 应用需预注册事件订阅,且系统可能限制完全退出应用的事件接收。
- 自动唤醒应用需配置
AllowBackgroundStart权限,但审核严格。
方案二:通过代理提醒结合蓝牙状态检测
若蓝牙断开需触发提醒,可改为周期性检查蓝牙状态:
- 发布一个重复的日历提醒(如每30分钟),在提醒触发时执行以下逻辑:
// 在提醒的回调中检查蓝牙状态
reminderAgentManager.publishReminder(calendarReminder).then(() => {
bluetooth.getProfile(ProfileId.A2DP_SOURCE).then((profile) => {
profile.getDeviceState(deviceId); // 检查设备连接状态
if (state === 'DISCONNECTED') {
// 发布断开通知
}
});
});
- 提醒类型需设置为系统可持久化的日历或闹钟提醒(而非倒计时)。
关键约束说明
系统资源限制:鸿蒙对后台应用和代理提醒的资源分配有严格管控,频繁唤醒或持久化任务可能被系统拦截。
权限要求:
代理提醒需 ohos.permission.PUBLISH_AGENT_REMINDER。
蓝牙操作需 ohos.permission.USE_BLUETOOTH 和 ohos.permission.DISCOVER_BLUETOOTH。
用户体验:过度唤醒应用或频繁通知可能影响设备续航,需遵循鸿蒙设计规范。
代理通知恢复:优先使用绝对时间的日历提醒,并在应用启动时同步提醒状态。
蓝牙状态监听:若实时性要求高,考虑让应用常驻后台(通过ServiceAbility);若可接受延迟,使用周期性代理提醒检测。
这两个需求建议拆开看。reminderAgentManager 能保证的是“已经发布成功的提醒”在应用退出或冻结后由系统代理触发,它不等同于开机自启,也不能让普通三方应用在重启后静默启动并重新生成提醒。建议先确认提醒是否用的是明确时间型的 ReminderRequestAlarm / ReminderRequestCalendar,publishReminder 成功后 getValidReminders() 是否还能查到,通知权限和 ohos.permission.PUBLISH_AGENT_REMINDER 是否开启,以及业务代码里是否有覆盖或取消提醒。
如果需求是“手机重启后应用未打开也自动重新设置一批闹钟”,普通应用一般不能依赖后台自启动实现,建议在用户下次打开应用、用户明确触发的入口,或系统允许的任务入口里补齐提醒。
蓝牙断联唤醒也类似:应用存活或用户明确开启长时任务期间,可以监听蓝牙连接状态并震动/发通知;但进程被杀后,普通三方应用通常不能常驻监听蓝牙并静默唤醒执行震动。更稳的产品方案是:用户手动开启守护/长时任务,任务期间通过通知保持可感知运行;进程不存在时退化为下次打开时校验状态,或由手表/系统侧能力提醒。
第一个问题,如果是日历/闹钟/倒计时这类提醒,应该用 reminderAgentManager,它的定位就是应用被冻结或退出后由系统代理提醒;但要提前发布提醒,并申请 ohos.permission.PUBLISH_AGENT_REMINDER、开启通知权限。
第二个问题要谨慎:普通三方应用通常不能在“进程完全不存在”时长期监听蓝牙状态并静默唤醒自己。蓝牙交互场景可以在用户明确使用期间申请 BLUETOOTH_INTERACTION 长时任务,并配通知保持后台任务;进程被杀、重启后仍自动监听蓝牙断开,这类能力会受系统后台管控,不能按常驻服务来设计。
更稳的是:前台/后台任务期间监听蓝牙,断开后发通知或更新业务状态,用户点击通知再进入应用。参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-reminderagentmanager
- 我有代理提醒权限,问题是重启后这些提醒会消失,如何在重启后也能提醒。
- 在app运行时可以监控蓝牙,但是我想没有运行app时有没有方法断开蓝牙后自动唤醒app。
先回答你问题一:你可以试试这个[@ohos.reminderAgentManager (后台代理提醒)-ArkTS API-Background Tasks Kit(后台任务开发服务)-应用框架 - 华为HarmonyOS开发者](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-reminderagentmanager#reminderagentmanagerpublishreminder)
系统托管+通知全开,应该可以实现你的需求。但是为了防止代理提醒被滥用于广告、营销类提醒,影响用户体验,部分设备上代理提醒增加了管控机制。管控后的适配或申请权限的方法。
然后是问题二:用 bluetoothInteraction 长时任务监听 + 断开发通知(WantAgent 唤醒);进程被杀后靠关联启动尝试拉起
import { bluetooth } from '[@kit](/user/kit).ConnectivityKit';
// 监听蓝牙开关状态
bluetooth.on('stateChange', (state) => {
if (state === bluetooth.BluetoothState.STATE_OFF) {
console.log("蓝牙关闭,触发唤醒逻辑");
wakeUpAppByNotification(); // 发通知唤醒
}
});
// 监听BLE连接断开(设备断连)
import { ble } from '[@kit](/user/kit).ConnectivityKit';
ble.on('BLEConnectionStateChange', (deviceId, state) => {
if (state === 0) { // STATE_DISCONNECTED
console.log("设备断开,触发唤醒");
wakeUpAppByNotification();
}
});
import { bundleManager, WantAgent, wantAgent } from '[@kit](/user/kit).AbilityKit';
import { backgroundTaskManager } from '[@kit](/user/kit).BackgroundTasksKit';
import { BusinessError } from '[@kit](/user/kit).BasicServicesKit';
class BackgroundRunningManager {
public static async startBackgroundRunning(context: Context) {
let bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
let wantAgentInfo: wantAgent.WantAgentInfo = {
wants: [
{
bundleName: bundleInfo.name,
abilityName: 'MainAbility' // 替换为你的Ability名称
}
],
requestCode: 0,
actionFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG],
};
try {
let wantAgentObj: WantAgent = await wantAgent.getWantAgent(wantAgentInfo);
await backgroundTaskManager.startBackgroundRunning(
context,
backgroundTaskManager.BackgroundMode.BLUETOOTH_INTERACTION,
wantAgentObj
);
console.info('Start bluetooth interaction background running succeeded');
} catch (error) {
console.error(`Failed to start background running. Code: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`);
}
}
}
系统管控:申请长时任务后,系统会进行校验,确保应用确实在执行对应的蓝牙任务。同时,系统会关联一个通知栏消息,用户删除该通知会触发系统自动停止长时任务。
与其他蓝牙模块配合:bluetoothInteraction长时任务主要保障进程在后台的活动状态。具体的蓝牙操作(如连接、发现服务、读写特征值)仍需使用对应的蓝牙 API 模块(例如 @kit.ConnectivityKit中的 bluetooth或 a2dp模块)实现。
错误处理:启动长时任务可能因权限不足、资源限制等原因失败,务必通过 try-catch捕获 BusinessError并处理错误码。
电量与性能:长时间后台运行蓝牙任务会增加功耗,建议仅在必要时启动,并在任务完成后及时停止。
希望HarmonyOS能加强与其他品牌设备的兼容性,让更多人受益。
1,我有代理提醒权限,问题是重启后这些提醒会消失,如何在重启后也能提醒。2,在app运行时可以监控蓝牙,但是我想没有运行app时有没有方法断开蓝牙后自动唤醒app。
那没办法,除非能够开机自启动,但是鸿蒙的普通应用默认无法实现开机自启动。这一能力目前主要面向企业MDM(移动设备管理)应用开放,需要特定的系统权限和设备管理能力。第二个也是,App 被杀死就无法进行唤醒
-
用reminderAgentManager
-
用commonEventManager
抛砖引玉,来了那么多。
鸿蒙Next权限分为普通权限和敏感权限。敏感权限(如位置、相机、麦克风)需在module.json5中声明,并在运行时调用abilityAccessCtrl.requestPermissionsFromUser()弹窗申请。权限授权状态可通过checkPermission()查询。注意权限分组:如ohos.permission.LOCATION属于位置权限组,需用户主动授权。
针对这两个权限问题:
-
代理通知重启自启动:应用需申请开机广播权限
ohos.permission.RECEIVE_BOOT_COMPLETED,并在module.json5中配置subscribes为系统公共事件COMMON_BOOT_COMPLETED。开机后系统会拉起应用,在对应Ability中重新注册代理通知服务,即可接收提醒。 -
蓝牙断开唤醒:应用无需保持前后台运行。在
module.json5中静态订阅蓝牙状态变更事件(如usual.event.bluetooth.host.STATE_CHANGE),并声明ohos.permission.COMMONEVENT_STICKY权限。蓝牙断开时系统会发送粘性事件,自动唤醒应用处理,实现断开唤醒。


