基于Harmony OS Next ArkTS API 13实现的网易云音乐App模块代码分析——后台运行模块

虽然音乐播放以及下载的后台应用实现有FA模型的Service Ability可以实现,但是目前主推的Stage模型中,后台应用的实现更推荐使用申请长时间应用来实现。

项目地址:Chenlvin/CloudMusic-HarmonyOSNext: 支持鸿蒙5.0的音乐App

相关文档:

长时任务

@ohos.resourceschedule.backgroundTaskManager (后台任务管理)(系统接口)

@ohos.app.ability.wantAgent (WantAgent模块)

代码如下:

//src/main/ets/common/utils/play/ContinuousTask.ets
import { BusinessError } from '@kit.BasicServicesKit';  
import { backgroundTaskManager } from '@kit.BackgroundTasksKit';  
import { WantAgent, wantAgent } from '@kit.AbilityKit';  
import { LogUtil } from '@pura/harmony-utils';  
  
/**  
 * 长时任务  
 */const TAG = '[ContinuousTask] '  
  
class ContinuousTask {  
  private context: Context = getContext(this)  
  
  async startTask() {  
    let wantAgentInfo: wantAgent.WantAgentInfo = {  
      wants: [  
        {  
          bundleName: "cc.chenlvin.cloudmusic",  
          abilityName: "EntryAbility"  
        }  
      ],  
      actionType: wantAgent.OperationType.START_ABILITY,  
      requestCode: 0,  
      actionFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]  
    };  
  
    wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj: WantAgent) => {  
      backgroundTaskManager.startBackgroundRunning(this.context,  
        backgroundTaskManager.BackgroundMode.AUDIO_PLAYBACK, wantAgentObj).then(async () => {  
        LogUtil.info(TAG + `启动长时任务 Start Background Running.`);  
      }).catch((err: BusinessError) => {  
        LogUtil.error(TAG + `启动长时任务 Start Background Running 失败:Code - ${err.code}, Message - ${err.message}`);  
      });  
    });  
  }  
  
  async stopTask() {  
    backgroundTaskManager.stopBackgroundRunning(this.context).then(() => {  
      LogUtil.info(TAG + `成功结束长时任务 Stop Background Running.`);  
    }).catch((err: BusinessError) => {  
      LogUtil.error(TAG + `结束长时任务 Stop Background Running 失败:Code - ${err.code}, Message - ${err.message}`);  
    });  
  }  
}  
  
const conTask = new ContinuousTask()  
export default conTask as ContinuousTask

启动长时任务的过程:

1.使用wantAgent获取实例的用户ID、获取want信息

2.然后在回调函数中传入获取到的wantAgentObj,使用BackgroundTasksKit.startBackgroundRunning实现申请长时任务并输出日志

模块解释

app.ability.WantAgent模块提供了创建WantAgent实例、获取实例的用户ID、获取want信息、比较WantAgent实例和获取bundle名称等能力。

BackgroundTasksKit模块提供申请后台任务的接口。当应用退至后台时,开发者可以通过本模块接口为应用申请短时、长时任务,避免应用进程被终止或挂起。

关闭长时任务:

使用BackgroundTasksKit.stopBackgroundRunning即可关闭长时任务

用户操作过程以及响应:

1.进入应用,点击播放,退出音乐界面推送至后台执行;
此时调用conTask.startTask

2.再次进入应用,音乐播放进度条显示正常;

3.点击暂停播放,取消长时任务
此时调用conTask.stopTask

调用到的三方库

@pura/harmony-utils 的 LogUtil

这是一个优化过的日志输出组件,能够更加方便地输出自定义格式的日志,方便调试。

posted @   EmptyEmeraldTablet  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示