qt for android程序保活 程序后台一直运行不被清理掉(未完)

本博主要就是分享如何让qt开发的android程序在手机上运行,切换到后台的时候,程序仍然在一直运行,为什么这么做呢,因为我有需求是app连接蓝牙后,程序切换到后台,仍然能接受到蓝牙发送的数据并保存时间等信息,但是在实际实验中发现,在app切换到后台后,定时器中的计数就停止了,说明锁屏或者切换后台程序处于低优先级状态,在打开程序后,定时器中的计数接着按home键之前的数,说明程序是没有被打死的,程序的内存还在,所以,问题就来了,如何让程序在后台持续运行,并且有消息能处理。看似简单的问题,实际操作起来很难,像一些程序,qq,微信,,,大公司的程序很轻而易举的就可以实现后台运行,但他们绝对不是用qt开发的,所以,我的目标就是用qt来实现这个功能,因为我不是搞安卓开发的,只是业余,玩玩而已,哈哈,正文开始:

 

1.提高服务优先级:

通常保活都离不开Server,一般情况下,播放**媒体播放**等服务会被系统授予较高的优先级,
但是,如果该服务占用资源过高,还是容易被gc掉,所以这里我后台循环播放一段只有几十Kb的音量为0的音频。

2.创建守护进程

简单的说,就是创建2个以上的服务,服务之间相互唤醒
具体做法就是在一个服务的**onDestory()**销毁时,发送一个广播给其他还活着的服务,
活着的服务收到广播立即唤醒被回收的服务。
这里注意,守护进程里面尽量少做事,少占内存。

3.定时唤醒+持续占有(这个事情qq干过)

  • 监听一些系统广播,比如锁屏广播(因为现在很多高版本的Android系统会在系统锁屏时进入打盹模式,后台的很多东西容易被清理)
  • 收到锁屏广播后,创建一个只有1像素的页面。(页面其实是看不见的),提高进程优先级
  • 系统解锁后,移除这个1像素页面。

https://blog.csdn.net/gf771115/article/details/77457053

 

2019年5月19日01:28:55  脑壳疼,还没搞定,采用WakeLock方式,但是 

一直失败,明天继续尝试,累死了睡觉

2019年5月19日20:20:02

搞不出来,很难受,在网上了解了几个方式,都想去尝试,但是有的方式能 尝试,无效果, 有的方式压根都不知道去如何尝试,技术差得远,愁人。

想要尝试的几种方式:

1.使用wakelock,使主线程持有锁,不会被挂起,直到程序退出才释放锁,不知道是不是这样用,反正没有效果

2.使用 双线程,互相唤醒,我就是创建了一个子线程,但是不知道如何去实现两个线程之间互相唤醒

3.创建service,让程序在后台之后,service保持运行,数据都在service内处理,这个service貌似在java中,创建一个定时器,

然后把你想要处理的数据放在这里处理,那么问题来来,因为使用的是qt,只会qt调用java文件去执行一些Android原生的功能,不知道怎么把qt的程序内容发给java然后再去处理,这就很坑了。

4.后台播放一段0音量的音频文件,提高程序的优先级,未实现。

附上几个参考链接,希望对各位看官有所帮助:

https://blog.csdn.net/ryantang03/article/details/8628753

http://blog.chinaunix.net/uid-29355319-id-4491428.html

https://www.jianshu.com/p/48ed37738a9e

https://blog.csdn.net/hello_json/article/details/84954039

https://blog.csdn.net/jun4331247/article/details/51182390

我的最总结果是未实现效果,今后有机会一定继续把这块欠缺补上,继续补在这个博客 下面。

Android 上实现后台保活程序通常可以通过以下几种方式: 1. 使用 Foreground Service:将应用程序的 Service 设为 Foreground Service,这将使操作系统将其视为正在运行的前台应用程序,从而使其更难被系统杀死。 2. 使用 AlarmManager:使用 AlarmManager 提交一个定期的任务,以确保您的应用程序后台继续运行。 3. 使用 JobScheduler:JobScheduler 是一个 Android 系统服务,它为您提供了在特定条件下启动作业的能力。您可以设置一项作业,并定义一个触发器,以便在特定条件下启动该作业。 4. 使用 WorkManager:WorkManager 是一个用于在 Android 上安排后台任务的库。它可以在 Android API 14(Android 4.0 Ice Cream Sandwich)及更高版本上运行,可以在设备空闲时运行任务,也可以在设备重新启动后保留任务。 在使用 Qt for Android 开发应用程序时,您可以使用 Qt Android Extras 模块中的 QAndroidJniObject 类,通过 JNI 调用 Android API 提供的上述机制来实现后台保活程序。例如,您可以使用以下代码将应用程序的 Service 设为 Foreground Service: ```cpp QAndroidJniObject jniObject("org/qtproject/example/MyService"); if (jniObject.isValid()) { QAndroidJniObject activity = QtAndroid::androidActivity(); if (activity.isValid()) { jint id = 1; QAndroidJniObject notification = QAndroidJniObject::fromString("Foreground Service is running."); QAndroidJniObject channelId = QAndroidJniObject::getStaticObjectField<jstring>("android/provider/Settings$Secure", "ANDROID_ID"); QAndroidJniObject builder("android/app/Notification$Builder", "(Landroid/content/Context;Ljava/lang/String;)V", activity.object<jobject>(), channelId.object<jstring>()); builder.callObjectMethod("setContentTitle", "(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;", notification.object<jstring>()); builder.callObjectMethod("setContentText", "(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;", notification.object<jstring>()); builder.callObjectMethod("setSmallIcon", "(I)Landroid/app/Notification$Builder;", 0); QAndroidJniObject notificationObj = builder.callObjectMethod("build", "()Landroid/app/Notification;"); QAndroidJniObject service = QtAndroid::androidService(); if (service.isValid()) { service.callMethod<void>("startForeground", "(ILandroid/app/Notification;)V", id, notificationObj.object<jobject>()); } } } ``` 此代码将使用 QAndroidJniObject 调用 Android API 的 startForeground 方法,以将应用程序的 Service 设为 Foreground Service。请注意,您需要在 AndroidManifest.xml 文件中声明您的 Service,并在应用程序启动时启动该 Service。 希望这可以帮助您实现后台保活程序
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大桶矿泉水

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值