CJ7235
CJ7235
  • 发布:2019-10-21 09:54
  • 更新:2024-07-02 17:20
  • 阅读:8492

uni-app 如何其实前台service 以做到应用保活

分类:uni-app

启动一个前台的Service进程,这样会在系统的通知栏生成一个Notification,用来让用户知道有这样一个App在运行着,哪怕当前的App退到了后台。也能在通知栏看到app运行着,做到app 保活

2019-10-21 09:54 负责人:无 分享
已邀请:
爱吃鱼的靖哥哥

爱吃鱼的靖哥哥 - 行走在全栈路上的码农

最简单的保活,后台循环播放一个无声的mp3,如果用背景音乐播放在通知栏也会有提示,无声的mp3网上可以下载

  • h***@163.com

    兄弟,你是真牛,这个方法很好使,解决了我的问题,简单便捷有效。

    2023-10-20 14:42

  • h***@163.com

    非常感谢

    2023-10-20 14:42

  • 2***@qq.com

    回复 h***@163.com: 会不会很耗电?

    2024-01-25 16:08

  • mishangwo

    回复 h***@163.com: 安卓不行吧,ios倒是没问题。

    2024-07-12 15:28

  • mishangwo

    你好,这个方法我用了。ios下确实是可以的。你是否试过安卓,我试了,最多保活20分钟。

    2024-07-25 02:39

3***@qq.com

3***@qq.com - alexkitc

给大家提供一个详细的,自己的实现过程哈,android端完美前台保活:
1.首先需要实现一个原生插件,原生插件需要拉起一个前台service,然后uniapp侧引入,执行暴露给js的方法即可,下面是详细配置+代码:希望帮助到大家

  1. android 原生侧:基于官方sdk,app模块目录下assets下的uniplus那个json文件:
    {
    "hooksClass": "包名.你的那个module类名",
    "plugins": [
    {
    "type": "module",
    "name": "随便起一个service的名字",
    "class": "包名.你的那个module类名"
    }
    ]
    }
  2. 然后是你自己新建的模块:比如你要实现一个Module,叫做MyModule(可以基于sdk那个module直接拷贝过来改),mainfest权限文件
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="io.github.alexkitc.xxxservice(包名)">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

    <application>
    <service android:name=".实现service接口的类名(注意前面的点)" android:exported="true" />
    </application>

</manifest>

4。然后是实现UniModule的类
public class xxxPluginModule extends UniModule {

public Context context;  

public xxxPluginModule () {  
    super();  
}  

@UniJSMethod(uiThread = true)  
public void startxxxService(UniJSCallback callback) {  

    if (context == null && mUniSDKInstance != null) {  
        context = mUniSDKInstance.getContext();  
    }  

    try {  
        Intent intent = new Intent(context, xxxService.class);  

        //开启前台service(非activity需要使用this.mUniSDKInstance.getContext()上下文间接启动)  
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {  
            context.startForegroundService(intent);  
        } else {  
            // 安卓7兼容  
            context.startService(intent);  
        }  
    } catch (Exception e) {  
        Log.e("err", e.getMessage());  
    }  

}  

}

  1. xxxService 需要实现Service,比如我的场景
    public class xxxService extends Service {
    里面实现一个本地的socket(使用单独的线程开启监听)内部逻辑换成你自己的即可
    }

然后android studio右侧的gradle打包(other的assebleRelase)即可得到build目录下xxx.aar文件,拷贝到hbuilder那边的uniapp工程,具体目录为工程下的nativeplugins下的xxxModule/android下,aar放这儿,然后还需要一个package.json放在xxxModule根目录,跟android目录同级,内容如下

{
"name": "xxxModule",
"id": "xxxModule",
"version": "1.0.0",
"description": "xxx service",
"_dp_type":"nativeplugin",
"_dp_nativeplugin":{
"android": {
"plugins": [
{
"type": "module",
"name": "xxxModule",
"class": "io.github.alexkitc.xxx实现unimodule的那个类名"
}
],
"abis": [
"armeabi-v7a",
"arm64-v8a",
//注意这儿可能影响pc模拟器运行
"x86"
],
"integrateType": "aar"

    }  

}  

}

然后hbuilder这边mainfest选择本地插件,然后制作自定义基座,然后运行后,在js需要的地方
const xxxService = uni.requireNativePlugin("xxxModule")
const result = xxxService.startxxxService() 就可以拉起原生的service啦,
亲测通过,其实核心就是非activity上下文,context的处理。有了context就好办了。有不懂的再跟哈,我也是第一次给uniapp写原生插件,感觉二者之间的调试日志不是很直观

  • 4***@qq.com

    我也遇到这样的问题,麻烦能给个完整的代码吗,尤其是

    xxxService 需要实现Service,比如我的场景

    public class xxxService extends Service {

    里面实现一个本地的socket(使用单独的线程开启监听)内部逻辑换成你自己的即可

    }

    这一块不太明白

    2024-07-31 10:20

DCloud_heavensoft

DCloud_heavensoft

可以写一个原生插件。不过通知栏也不一定有权限可以写入。unipush是目前推送信息送达率最高的方案

  • CJ7235 (作者)

    个人对安卓技术是小白。。。这个难搞了

    2019-10-21 15:43

  • CJ7235 (作者)

    大神可以给个例子指导下么

    2019-10-21 17:09

  • 5***@qq.com

    回复 CJ7235: 哥们这个问题有眉目了吗? 我也有这个需求,不行的话可以一起找人写安卓原生插件

    2020-02-18 11:44

  • CJ7235 (作者)

    回复 5***@qq.com: 需求被我推掉了,我个人没实现出来

    2020-02-18 16:59

  • 5***@qq.com

    回复 CJ7235: 保活需求本来就是流氓需求,我们改变策略了,只要安卓实现离线推送就好了。

    2020-02-18 21:45

  • 小猪姵琪

    回复 5***@qq.com: 兄弟,那你们实现了安卓离线推送了吗

    2020-04-02 14:59

  • byeworld

    回复 CJ7235: 我现在被要求做进程辅助保活之类。。无从下手

    2021-03-04 14:41

  • 1***@qq.com

    回复 5***@qq.com: 我们有一个通话录音的问题,估计是需要设置应用处于前台,也是挺麻烦。要不然录音的根本就没声音。

    2021-06-30 10:06

2***@qq.com

2***@qq.com

https://ext.dcloud.net.cn/plugin?id=2930可以实现黑屏保活

FullStack

FullStack - 【插件开发】【专治疑难杂症】【ios上架、马甲包、白包、过审、已成功上架过几百个】【多款插件已上架:https://ext.dcloud.net.cn/publisher?id=22130】【非诚勿扰】QQ:543610866

1***@qq.com

1***@qq.com

uniapp的权限配置压根没有android.permission.FOREGROUND_SERVICE这个权限,前台保活也用不了吧,android9以上都需要有这个权限

  • 3***@qq.com

    在uniapp权限配置,额外添加权限那边硬写。我是写在最后了,目前测试后台保活还行(取消省电策略之后),能保持后台,锁屏运行一个半小时。(应该能更长时间,但是我半路没忍住点进去了)

    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

    2024-01-08 12:45

2***@qq.com

2***@qq.com - 温州魔鹏互联信息技术有限公司,多种语言都可开发。

默认系统应用呢?

要回复问题请先登录注册