浅谈Android内存泄漏&&实现杀不死的无界面后台Service

以前看大神的博客,都说没有碰到过内存泄漏或者OOM就不算真正的搞过Android…以前我觉得这事离我还好远….
没想到,这次真的是遇上了!!
项目需求是这样的:app开机自启,启动之后app就一直在run,是一直run!(开机自启,现在大概也就只有在ARM板的原生系统里实现了…后面的杀不死的后台Service也是在原生系统上实现的)

遇到的问题:app开机自启,跑了7,8个小时后app挂掉了
一开始还以为是代码有问题,但是代码有问题也不可能跑7,8个小时才挂呀…在Google的帮助下,觉得是内存泄漏了。好,那就学着用MAT(MemoryAnalyzerTools)去看看到底是哪些资源没释放掉呗, MAT的使用可以参照网上大神们的博客。通过MAT的初步分析,是一个工具类里面把context声明成static,并且将MainActivity#this赋给了这个static变量。由于app里需要对SQLite进行频繁的操作(在线程里while(true)去读,不要问为什么用while(true),这是前面的人写的逻辑,我负责填坑),所以必须要有context对象,然后在胡凯大神博客里找到了答案
博客截图
好,那就将MainActivity Context改成getApplicationContext…..

还有一个需要修改的地方,由于需要频繁的操作SQLite所以cursor必须得保证释放掉,之前的代码是直接调用cursor#close方法去释放资源,现在改成在finally代码块里去调用crusor#close,这他妈还不能释放?!

改完觉得没啥问题了,让app再跑7,8小时…………..FU**还是挂掉了

这下懵逼了,只好求教公司的大神了,大神说app能跑7,8个小时,那代码肯定是没问题的,大神最后的建议就是在频繁操作SQLite的地方加上sleep,释放掉CPU占用….好,改代码…果然,app不挂了…..

当然,加sleep不是上上策,因为根本没有找到问题的所在。然后我在另外一块ARM板上跑没有加sleep的代码,竟然跑了几天都不挂…..那么是板子的性能问题?无奈项目太赶,这个问题就用加sleep解决了…

关于Android的内存泄漏,还想说的是,在代码里还是尽量少用static,因为释放不了……

好像很多同学都会碰到这种需求:做一个没有界面的app(或者service)在后台一直跑
这种需求,可以很明确的说,现在只有在原生的Android系统里可以实现。因为现在的手机厂商肯定不会让开发者这样搞,不然我们的手机还能用吗?

所谓的没有界面,其实是不使用或者不显示Activity(至少我是这样做的)。真正的无界面,我觉得只要是在Android上跑的app都不可能(有大神实现了的求指教哇)。

我是这样实现的:app获取开机广播(这个也是只有在原生Android系统里才能实现),然后startService开启一个IntentService。这样的话,虽然有MainActivity但是我们没有对它有任何的处理和显示,也就是说把MainActivity架空了,在IntentService里重写onStartCommand方法
这里写图片描述

这段代码就实现了将IntentService变成了前台进程,在通知栏里会有app的图标出现,这样就实现了无界面的后台service……..当然,再次声明,这只能在原生的Android系统里实现……

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值