启动一个前台的Service进程,这样会在系统的通知栏生成一个Notification,用来让用户知道有这样一个App在运行着,哪怕当前的App退到了后台。也能在通知栏看到app运行着,做到app 保活
 
                                        
                                    
                                    - 发布:2019-10-21 09:54
- 更新:2024-07-02 17:20
- 阅读:11866
 
                                                                    
                                                                3***@qq.com - alexkitc
给大家提供一个详细的,自己的实现过程哈,android端完美前台保活:
1.首先需要实现一个原生插件,原生插件需要拉起一个前台service,然后uniapp侧引入,执行暴露给js的方法即可,下面是详细配置+代码:希望帮助到大家  
- android 原生侧:基于官方sdk,app模块目录下assets下的uniplus那个json文件:
 {
 "hooksClass": "包名.你的那个module类名",
 "plugins": [
 {
 "type": "module",
 "name": "随便起一个service的名字",
 "class": "包名.你的那个module类名"
 }
 ]
 }
- 
然后是你自己新建的模块:比如你要实现一个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());  
    }  
}  }
- 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写原生插件,感觉二者之间的调试日志不是很直观
 
                                                                    
                                                                FullStack - 【插件开发】【专治疑难杂症】【ios上架、马甲包、白包、过审、已成功上架过几百个】【多款插件已上架:https://ext.dcloud.net.cn/publisher?id=22130】【非诚勿扰】QQ:543610866
后台保活、不保证所有场景下有效(ios) :https://ext.dcloud.net.cn/plugin?id=9118
 
             
             
             
			 
                                                                    
 
                                                                    




 
                                                                    
 
                                                                    
 
                                                                     
            
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
阿乐呀
回复 mishangwo: 你好请问这个方法要怎么实现,我用uniapp的uni.getBackgroundAudioManager(),app切到后台录音还是会关闭
2025-06-03 15:05
爱吃鱼的靖哥哥
回复 阿乐呀: 你看下插件市场呢,好像有人用了我这个方法做了个插件
2025-06-13 11:40