安卓应用开发,应用开启服务在后台运行,息屏一段时间后被关了,找原因和解决方案。

1.描述问题:

 【用于科研,非商业】安卓应用开发,需要保持应用长时间运行获取定位信息,应用开启后启动Activity,然后启动Service,保持Service一直在后台运行。考虑到我们是请一些人帮忙装上应用的,所以主要是想让用户将应用添加到保护名单中,来保证应用正常运行时能够长不被清理掉。
 【功能】Service做的事情包括:监听亮屏息屏、获取加速度传感器数据、调用百度SDK获取定位(由于GPS耗电量大,目前一直仅用wifi、基站等较低功耗的定位方式在测试)、操作SQLite数据库、Service中开启一个Thread每隔20s查询下数据库,数据足够量如10条时发送数据到服务器,handler回调。
 【ps】Service持有了PARTIAL_WAKE_LOCK,CPU电源锁。
 【服务保活】使用了:1.保持前台Notification;2.在手机中添加到加速白名单、应用后台保护,从而防住了锁屏几秒就被清理;3. 1像素保活;
 【设备】华为荣耀7;型号PLK-TL01H;EMUI4.0.3;安卓6.0;运行内存3.0GB;

2.相关代码:

无。

3.报错信息:

无报错,尝试过Crash时记录下信息,然后下次打开时传输到服务器以便查看crash信息,但是发现没有发送。(这个发送crash信息的功能经人为增加int i=1/0;测试过,能够获取到除数不为0的报错信息)

4.尝试过的方法及反馈:

**1.对比测试**:
  1.1 连接电脑,不拔出usb线,一天都不会被退出;
  1.2 拔出usb,应用退到后台,保持亮屏,应用大半天都没被退出;
  1.3 拔出usb,应用退到后台,息屏,应用普遍半小时到两个多小时内,会被退出;
  1.4 尝试过,后台边播放音乐来保活,应用退到后台,息屏,能听到音乐,应用长时间没被退出;

**2.捕获Crash信息:**
  测试并使用了捕获Crash信息然后发送到服务器,发现运行一段时间然后被退出的情况下,不会有crash信息被捕获;

**3.思考OOM:**
  在思考是否因OOM导致内存不足而退出应用,但是似乎不像是这个原因,理由如下:1.没有crash信息;2.连接usb线运行一天也没有发现OOM;3.保持亮屏时长时间也没有被退出;

5.相关截图:

无。

6.提问及思考,求解疑:

Q1.什么原因,会导致应用在连接usb或者直接亮屏时能够持续运行,而息屏后被退出却捕获不到crash信息?
A1:似乎并非OOM,而是被系统清理掉。

Q2:以上表现是否验证了“应用被系统清理掉”的假设?如果是被系统清理掉,那么能导致被系统清理掉的原因有哪些(梳理总结)?
A2:当前觉得,是否是因为耗电量太大,导致应用会运行一段时间后被清理?并且这种清理是添加到内存加速白名单、应用后台保护,后仍然会生效的、能够清掉应用的?

1个回答

1:如果是OOM肯定会有报错信息,告诉你出现了内存泄漏。熄屏后被退出是系统把后台进程给杀死了。
2:就目前而言,答主自己的手机系统是Android8.0,对于后台运行耗电量巨大的应用,会在通知栏给出警告,引导用户进行清理。你这里是Android6.0系统,答主没有用过,不过应该没有这种提示,后台运行的耗电量巨大的应用会被系统主动清理。
3:此外,你这里的后台应用做的工作比较多,比如监测手机状态,进行网络传输,内存消耗也很可观,内存占用一定程度后自然会被系统给回收掉。添加内存加速白名单应该会避免因为占用内存被清理掉。
4:正常情况下,如果一个应用被转到了后台运行,那么一段时间内不来到前台就会面临被清理掉的风险。被清理掉的原因很多,节省电量,节省内存,保证运行速度等。单一添加到白名单效果不会很大。

qq_34149335
奋进的代码 回复pwtpui: 对内存进行优化是很不错的选择,此外还建议你对关键性数据进行三级缓存处理,以此减少网络请求量和断线后的快速反应。这里如果可以的话,可以参考百度或者高德他们在进行导航时的做法,采用始终亮屏保证活动始终处于前台,这样来避免被系统轻易清理。
9 个月之前 回复
pwtpui
pwtpui 感谢回答,针对2我反馈下,我这里Android6.0的系统也有通知提醒耗电量较大,然后可以点击清理或者不再提示,我都点击了不再提示。 我接下来往节省电量、cpu和内存的方向尝试优化并测试。
9 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!