HarmonyOS 鸿蒙Next中怎么拉起app到前台?

HarmonyOS 鸿蒙Next中怎么拉起app到前台? 当app从前台切换到后台,有什么方式可以自动拉起app到前台吗?

尝试了

private async bringAppToForeground(): Promise<void> {
    try {
      await this.context.startAbility({
        bundleName: this.context.abilityInfo.bundleName,
        abilityName: this.context.abilityInfo.name
      });
      console.info('App brought to foreground');
    } catch (error) {
      console.error('Failed to bring app to foreground:', error);
    }
  }

会报错The application does not have permission to call the interface.

好像是需要需要ohos.permission.START_ABILITIES_FROM_BACKGROUND权限,但是这个权限得系统应用才能申请。

那还有其它方式可以实现吗


更多关于HarmonyOS 鸿蒙Next中怎么拉起app到前台?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

或许可以在录屏结束之后使用 Notification Kit 发送一条“录制完成,点击查看”本地通知,然后在通知的 Want 内配置为你的App信息,这样点击通知就进入到了App页面。

本地推送Demo是我当时方便测试写在 UIAbility 里的,可以参考一下:

// Notification Kit (本地推送) 实现
import { window } from '@kit.ArkUI'
import { AbilityConstant, UIAbility, Want, WantAgent, wantAgent } from '@kit.AbilityKit'
import { notificationManager } from '@kit.NotificationKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { JSON } from '@kit.ArkTS';
import { APP_BUNDLE_NAME, NOTIFICATION_KIT_ABILITY_NAME } from '../common/Constant';

// 点击通知后的打开`UIAbility`的`WantAgent`
let startUIAbilityWantAgent: WantAgent | undefined

export default class NotificationAbility extends UIAbility {
  // want目标页面
  private targetPage: string = '';

  /**
   * 申请系统通知权限
   */
  private async requestEnableNotification(): Promise<void> {
    try {
      await notificationManager.requestEnableNotification(this.context);
      hilog.info(DOMAIN_NUMBER, TAG, `#requestEnableNotification(): Succeeded in requesting enable notification`)
    } catch (e) {
      const err: BusinessError = e;
      hilog.error(DOMAIN_NUMBER, TAG, `#ERROR#requestEnableNotification(): Failed to request enable notification: ${err.code}, ${err.message}`)
    }
  }

  /**
   * 创建1条示例通知
   */
  async function createNotification(): Promise<void> {
    try {
      // 构建 Agent 并 创建通知。(可以携带参数,比如下方的"targetPage"属性:点击通知进入到指定页面使用,参数名称可自定义)
      await generateStartUIAbilityWantAgent({ 'targetPage': 'NotificationPage1' });
      await createSingleNotification(1, '导航到页面1');
      hilog.info(DOMAIN_NUMBER, TAG, `#createNotification(): 第1个通知 成功`)
     } catch (error) {
      hilog.error(DOMAIN_NUMBER, TAG, `#ERROR#createNotification(): Failed to create notification. Code: ${(error as BusinessError).code}, message: ${(error as BusinessError).message}`);
    }
  }

  /**
   * 构建启动`UIAbility`的`WantAgent`
   */
  async function generateStartUIAbilityWantAgent(parameters: Record<string, Object>) {
    let wantAgentInfo: wantAgent.WantAgentInfo = {
      // 点击通知后,将要执行的动作列表
      wants: [
        // TODO 修改为被拉起应用的`bundleName`和`abilityName`
        {
          bundleName: APP_BUNDLE_NAME,
          abilityName: NOTIFICATION_KIT_ABILITY_NAME,
          // 携带额外参数,用于路由到不同页面
          parameters,
        } as Want
      ],
      // 指定点击通知栏消息后的动作是拉起ability
      actionType: wantAgent.OperationType.START_ABILITY,
      // 使用者自定义的一个私有值
      requestCode: 0,
      // 点击通知后,动作执行属性
      actionFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG],
      // extraInfos: parameters
    }

    startUIAbilityWantAgent = await wantAgent.getWantAgent(wantAgentInfo)
      .then((wantAgentObj: WantAgent) => {
        hilog.info(DOMAIN_NUMBER, TAG, `#generateStartUIAbilityWantAgent#wantAgent.getWantAgent(): Successfully!`)
        return wantAgentObj
      })
      .catch((err: BusinessError) => {
        hilog.error(DOMAIN_NUMBER, TAG,
          `ERROR: #generateStartUIAbilityWantAgent#wantAgent.getWantAgent(): code is ${err.code} message is ${err.message}`)
        return undefined
      })
  }

  async function createSingleNotification(id: number, content: string): Promise<void> {
    let request: notificationManager.NotificationRequest = {
      content: {
        notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
        normal: {
          title: '本地通知',
          text: content,
          additionalText: '点击查看详情'
        }
      },
      id: id,
      wantAgent: startUIAbilityWantAgent // 添加意图

    };
    try {
      await notificationManager.publish(request);
    } catch (error) {
      hilog.error(DOMAIN_NUMBER, TAG, `#ERROR#createSingleNotification(): ${JSON.stringify(error)}`)
    }
  }

}

既然在后台不能调用 startAbility 方法,那好像自动返回前台是不行了。

参考:

另外我有个无关的疑问:你app发起的录屏可以录制除了本app以外的界面吗?这个不涉及鸿蒙的隐私设计嘛,我没写过类似的需求所以有这个疑问。

更多关于HarmonyOS 鸿蒙Next中怎么拉起app到前台?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


无解哦! 如果APP可以一直在前台,那岂不是就乱套了~

不是一直再前台哈,现在我的场景是,我APP有个录屏功能。开启录屏后,APP会启动长时任务确保切至后台仍可录制。当APP在后台的时候,如果用户是点击状态栏的“胶囊”结束录屏的话,想要能重新拉起app到前台。

总的来说,HarmonyOS是一款非常优秀的操作系统,期待它能在未来带给我们更多惊喜!

你有没有输出一下
bundleName: this.context.abilityInfo.bundleName,
abilityName: this.context.abilityInfo.name
是不是你要的值啊,

在HarmonyOS Next中,拉起应用到前台可使用wantAgent模块。通过wantAgent.trigger方法,传入包含目标应用bundleNameabilityNameWant对象,即可启动并切换到前台。需在module.json5中声明对应ability的可见性权限。

在HarmonyOS Next中,普通应用从前台切换到后台后,无法主动拉起自身到前台。这是系统出于安全、隐私和功耗管理的严格限制。

你遇到的错误和判断是正确的:

  1. ohos.permission.START_ABILITIES_FROM_BACKGROUND 权限是系统级权限,仅供系统应用使用,普通应用无法申请。
  2. 你尝试的 startAbility 方法(即使是启动自身)在后台调用时,如果没有此权限,系统会直接拒绝。

目前对于普通应用,没有官方允许的、可靠的方式实现“自动从后台拉起自身到前台”。

原因与设计考量: HarmonyOS Next 的应用生命周期管理更加严格,旨在防止恶意应用通过后台自启动、保活、链式拉起等方式滥用系统资源、消耗电量、侵犯用户隐私。这与Android生态的收紧趋势一致。

替代方案与建议: 如果你的场景是希望用户能快速返回应用,可以考虑以下符合平台规范的用户驱动方式:

  1. 使用通知(Notification): 当应用在后台有重要状态更新或需要用户操作时,发送一个持续的通知。用户点击通知后,系统会将你的应用切换到前台。这是最标准、最被推荐的方式。

    // 在后台创建并发布一个通知
    import notificationManager from '@ohos.notificationManager';
    // ... 构建NotificationRequest
    notificationManager.publish(request).then(() => {
      console.info("Notification published");
    });
    
  2. 使用长时任务(Long-term Task): 如果你的应用确实需要在后台执行特定类型的连续任务(如下载、播放音乐、导航等),可以申请对应的长时任务权限(如 ohos.permission.KEEP_BACKGROUND_RUNNING)。但这主要是为了让任务持续运行,并非为了让UI界面保持前台。当长时任务需要用户交互时,依然需要结合通知来引导用户点击返回。

  3. 优化应用状态恢复: 将应用状态(如页面、数据)妥善保存。当用户再次手动点击应用图标进入时,应用可以快速恢复到上次的界面和状态,提供无缝体验。这依赖于 onSaveStateonRestoreState 生命周期回调的正确使用。

总结: 直接通过代码将后台应用“自动”拉到前台的能力,在 HarmonyOS Next 上对普通应用是封闭的。你应该将设计思路调整为:通过通知等方式,主动、清晰地向用户发出请求,由用户决定并手动触发应用回到前台。 这符合系统的安全规范和对用户体验的保护。

回到顶部