启动一个前台的Service进程,这样会在系统的通知栏生成一个Notification,用来让用户知道有这样一个App在运行着,哪怕当前的App退到了后台。也能在通知栏看到app运行着,做到app 保活
- 发布:2019-10-21 09:54
- 更新:2024-07-02 17:20
- 阅读:9745
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