本博主要就是分享如何让qt开发的android程序在手机上运行,切换到后台的时候,程序仍然在一直运行,为什么这么做呢,因为我有需求是app连接蓝牙后,程序切换到后台,仍然能接受到蓝牙发送的数据并保存时间等信息,但是在实际实验中发现,在app切换到后台后,定时器中的计数就停止了,说明锁屏或者切换后台程序处于低优先级状态,在打开程序后,定时器中的计数接着按home键之前的数,说明程序是没有被打死的,程序的内存还在,所以,问题就来了,如何让程序在后台持续运行,并且有消息能处理。看似简单的问题,实际操作起来很难,像一些程序,qq,微信,,,大公司的程序很轻而易举的就可以实现后台运行,但他们绝对不是用qt开发的,所以,我的目标就是用qt来实现这个功能,因为我不是搞安卓开发的,只是业余,玩玩而已,哈哈,正文开始:
1.提高服务优先级:
通常保活都离不开Server,一般情况下,播放**媒体播放**等服务会被系统授予较高的优先级,https://blog.csdn.net/gf771115/article/details/77457053
但是,如果该服务占用资源过高,还是容易被gc掉,所以这里我后台循环播放一段只有几十Kb的音量为0的音频。
2.创建守护进程 简单的说,就是创建2个以上的服务,服务之间相互唤醒
具体做法就是在一个服务的**onDestory()**销毁时,发送一个广播给其他还活着的服务,
活着的服务收到广播立即唤醒被回收的服务。
这里注意,守护进程里面尽量少做事,少占内存。
3.定时唤醒+持续占有(这个事情qq干过)
- 监听一些系统广播,比如锁屏广播(因为现在很多高版本的Android系统会在系统锁屏时进入打盹模式,后台的很多东西容易被清理)
- 收到锁屏广播后,创建一个只有1像素的页面。(页面其实是看不见的),提高进程优先级
- 系统解锁后,移除这个1像素页面。
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
【qt|qt for android程序保活 程序后台一直运行不被清理掉(未完)】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
我的最总结果是未实现效果,今后有机会一定继续把这块欠缺补上,继续补在这个博客 下面。