uniapp 开发app 如何使用前台服务实现后台保活

在uniapp开发APP时,如何利用前台服务实现后台保活功能?目前测试发现应用进入后台后容易被系统回收,导致定时任务或WebSocket断开。希望实现类似音乐播放器的持久化通知栏效果,但不知道如何在uniapp中调用原生Android的前台服务,是否需要通过native.js或原生插件实现?求具体实现方案和代码示例。

2 回复

在uniapp中,可通过创建前台服务实现后台保活。使用plus.android.importClass引入Activity、Service等类,在Service的onStartCommand中调用startForeground显示通知,防止系统回收。需注意配置权限和通知渠道。


在 UniApp 开发中,实现后台保活可以通过 Android 前台服务(Foreground Service)实现,确保应用在后台持续运行。以下是实现步骤和示例代码:

实现步骤:

  1. 配置 Android 权限:在 manifest.json 中添加前台服务权限。
  2. 创建原生插件:使用 Android Studio 创建原生插件,实现前台服务逻辑。
  3. 注册服务:在 Android 原生代码中注册前台服务。
  4. 调用插件:在 UniApp 中调用原生插件启动/停止服务。

示例代码:

1. 配置 manifest.json(UniApp 项目):

{
  "name": "foreground-service",
  "android": {
    "permissions": [
      "android.permission.FOREGROUND_SERVICE"
    ]
  }
}

2. 创建 Android 原生插件(Java):

  • ForegroundService.java(前台服务类):
public class ForegroundService extends Service {
    @Override
    public void onCreate() {
        super.onCreate();
        // 创建通知渠道(Android 8.0+ 需要)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel("channel_id", "保活服务", NotificationManager.IMPORTANCE_LOW);
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            manager.createNotificationChannel(channel);
        }

        // 创建通知
        Notification notification = new NotificationCompat.Builder(this, "channel_id")
                .setContentTitle("应用运行中")
                .setContentText("后台保活服务")
                .setSmallIcon(R.drawable.ic_launcher)
                .build();

        // 启动前台服务
        startForeground(1, notification);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}
  • 插件模块注册(在 dcloud_uniplugins.json 中):
{
  "plugins": [
    {
      "type": "module",
      "name": "ForegroundPlugin",
      "class": "com.example.ForegroundPlugin"
    }
  ]
}
  • ForegroundPlugin.java(插件调用类):
public class ForegroundPlugin extends UniModule {
    @UniMethod
    public void startService(UniObject options, UniCallback callback) {
        Intent intent = new Intent(mUniSDKInstance.getContext(), ForegroundService.class);
        mUniSDKInstance.getContext().startService(intent);
        if (callback != null) callback.invoke("服务启动成功");
    }

    @UniMethod
    public void stopService(UniCallback callback) {
        Intent intent = new Intent(mUniSDKInstance.getContext(), ForegroundService.class);
        mUniSDKInstance.getContext().stopService(intent);
        if (callback != null) callback.invoke("服务已停止");
    }
}

3. 在 UniApp 中调用:

// 引入原生插件
const foregroundModule = uni.requireNativePlugin('ForegroundPlugin');

// 启动服务
foregroundModule.startService({}, (res) => {
    console.log(res);
});

// 停止服务
foregroundModule.stopService((res) => {
    console.log(res);
});

注意事项:

  • 功耗与用户体验:前台服务会显示持续通知,避免滥用。
  • 系统限制:不同 Android 版本对后台服务限制不同(如 Android 9+ 电源管理优化)。
  • 审核合规:Google Play 对后台服务有严格审核,需明确用途。

通过以上步骤,即可在 UniApp 中利用前台服务实现后台保活。

回到顶部