为了持续同步,申请了常驻通知栏权限,在设置中开启后,可以常驻通知栏,进行后台同步。如果不需要,可以在设置中关闭。

This commit is contained in:
2026-09-13 22:02:08 +08:00
parent d9c212785d
commit e62416e5ce
4 changed files with 34 additions and 7 deletions
@@ -12,7 +12,7 @@ import { LogUtil } from './LogUtil';
const WORK_ID: number = 1001; const WORK_ID: number = 1001;
export class BackgroundSyncService { export class BackgroundSyncService {
/** 申请长时任务(DATA_TRANSFER):申请成功后进程在后台不被挂起 */ /** 申请长时任务(DATA_TRANSFER):申请成功后进程在后台不被挂起,失败抛错由调用方提示用户 */
static async startContinuousTask(context: common.UIAbilityContext): Promise<void> { static async startContinuousTask(context: common.UIAbilityContext): Promise<void> {
try { try {
const info: wantAgent.WantAgentInfo = { const info: wantAgent.WantAgentInfo = {
@@ -30,6 +30,7 @@ export class BackgroundSyncService {
} catch (err) { } catch (err) {
const e = err as BusinessError; const e = err as BusinessError;
LogUtil.write(`长时任务申请失败: ${e.code} - ${e.message}`); LogUtil.write(`长时任务申请失败: ${e.code} - ${e.message}`);
throw new Error(`长时任务申请失败(错误码 ${e.code}`);
} }
} }
@@ -83,22 +84,32 @@ export class BackgroundSyncService {
} }
} }
/** App 启动时统一入口:注册延迟任务 + 按设置恢复长时任务 */ /** App 启动时统一入口:注册延迟任务 + 按设置恢复长时任务(恢复失败静默,不影响启动) */
static async initOnLaunch(context: common.UIAbilityContext): Promise<void> { static async initOnLaunch(context: common.UIAbilityContext): Promise<void> {
BackgroundSyncService.scheduleDeferredSync(context); BackgroundSyncService.scheduleDeferredSync(context);
const enabled: boolean = await AppSettings.getBackgroundSync(context); const enabled: boolean = await AppSettings.getBackgroundSync(context);
if (enabled) { if (enabled) {
await BackgroundSyncService.startContinuousTask(context); try {
await BackgroundSyncService.startContinuousTask(context);
} catch (err) {
// 启动时恢复失败不阻塞 App:下次开关切换或重启再试
}
} }
} }
/** 设置页开关切换 */ /** 设置页开关切换:失败抛错由页面提示并回滚 UI */
static async setBackgroundSync(context: common.UIAbilityContext, enabled: boolean): Promise<void> { static async setBackgroundSync(context: common.UIAbilityContext, enabled: boolean): Promise<void> {
await AppSettings.setBackgroundSync(context, enabled);
if (enabled) { if (enabled) {
// 先申请任务,成功才落盘设置(失败时设置页回滚开关)
await BackgroundSyncService.startContinuousTask(context); await BackgroundSyncService.startContinuousTask(context);
await AppSettings.setBackgroundSync(context, true);
} else { } else {
await BackgroundSyncService.stopContinuousTask(context); await AppSettings.setBackgroundSync(context, false);
try {
await BackgroundSyncService.stopContinuousTask(context);
} catch (err) {
// 停止失败(如任务本就不在运行)不影响设置保存
}
} }
} }
} }
@@ -1,6 +1,7 @@
import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit'; import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI'; import { window } from '@kit.ArkUI';
import { notificationManager } from '@kit.NotificationKit';
import { BusinessError } from '@kit.BasicServicesKit'; import { BusinessError } from '@kit.BasicServicesKit';
import { BackgroundSyncService } from '../common/BackgroundSyncService'; import { BackgroundSyncService } from '../common/BackgroundSyncService';
@@ -11,6 +12,16 @@ export default class EntryAbility extends UIAbility {
hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate'); hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');
// 后台同步:注册延迟任务兜底 + 按设置恢复长时任务 // 后台同步:注册延迟任务兜底 + 按设置恢复长时任务
BackgroundSyncService.initOnLaunch(this.context); BackgroundSyncService.initOnLaunch(this.context);
// 申请通知权限:日程提醒、后台同步常驻通知都依赖它(系统只弹一次授权框)
notificationManager.isNotificationEnabled()
.then((enabled: boolean): Promise<void> => {
if (!enabled) {
return notificationManager.requestEnableNotification(this.context)
.catch((): void => {});
}
return Promise.resolve();
})
.catch((): void => {});
} }
onDestroy(): void { onDestroy(): void {
+3 -1
View File
@@ -234,7 +234,9 @@ struct SettingsPage {
}); });
} catch (err) { } catch (err) {
this.backgroundSync = !value; // 失败回滚 UI this.backgroundSync = !value; // 失败回滚 UI
this.getUIContext().getPromptAction().showToast({ message: '设置失败,请重试' }); const msg: string = (err as BusinessError).message !== ''
? (err as BusinessError).message : '请重试';
this.getUIContext().getPromptAction().showToast({ message: `开启失败:${msg}` });
} }
} }
+3
View File
@@ -12,6 +12,9 @@
{ {
"name": "ohos.permission.INTERNET" "name": "ohos.permission.INTERNET"
}, },
{
"name": "ohos.permission.KEEP_BACKGROUND_RUNNING"
},
{ {
"name": "ohos.permission.PUBLISH_AGENT_REMINDER" "name": "ohos.permission.PUBLISH_AGENT_REMINDER"
}, },