关于Service常驻内存不被清理的解决方法.
众所周知, Service是跑后台的. 但是有些Rom厂商把一键清理做的真是太好用了, 以至于一键清理变成了一种习惯, Service已经变的不再是Service了. 那为什么像诸如360, 微信, QQ...却可以傍山傍水.哦, 用错词了. 大家懂的. .
言归正传, android的系统进程分为五个等级, Foreground Process(前台进程), Visible Process(可见进程), Service Process(服务进程), Background Process(后台进程), Empty Process(空进程), Service的进程处于第三个位置. 系统的回收会从低到高依次回收, 所以我们必须提高Service的等级, 仔细看Service的API会发现这么个方法.
public final void startForeground (int id, Notification notification)
这个方法是从API 5开始的, 又说费话了. 但是用了之后会发现通知栏会弹出个通知, 不弹通知人家让你传Notification干嘛, 哦, 好吧, 我又NC了. 这就很好的解释了360和LBE这些软件的那个通知了. 那QQ,微信为什么没有呢. 方法是死的, 人是活的.
我们可以这样.
private void startForegroundCompat() {
try {
if (Build.VERSION.SDK_INT < 18) {
Log.v(TAG, "startForgroundCompat");
startForeground(1120, new Notification());
}
} catch (Exception e) {
if (DEBUG) Log.e(TAG, "", e);
}
}
为什么要低于版本18呢, 那你这句就问的就是废话了. 有Bug呗, 开个玩笑, 在版本18以及以上, 会弹出个默认的通知, so, 要低于版本18.
那有人可能又想, 那我们写成这样呢.
startForeground(1120, null);
当然也不行了, 要是行还new个空的干嘛, 这样会报错滴.
如果这样做之后, 你会发现一键清理对你的Service是完全不起作用的(再也没有那该死的正在重新启动了, 你这么吊, 你经理知道吗, 啊. 啊). 你可以哈哈大笑了, 总算解决了个残留很久的问题了. 但是,但是...MIUI必须在自启动管理里允许, 否则下文一切都是扯淡.
网上还有说通过startCommand的返回值让Service是否重新启动, 我觉着这样很不好.
第一, 用户清理这是一对多的关系,也许用户并不想清理你的程序呢(当然这概率有点小. 你又不是微信, 人家是拿到船票的人, 跟你我屌丝能一样吗), 所以这样做的必要是有的. 好像跟上面的问题没多大关系啊.
其二, 我想清理, 结果你还重新启动, 哇靠, 这什么APP, 这么流氓, 关键我都定位到你那个详情了, 点停止你还启, 点停止你还启...比如那个类微信...(当然也可以清理, 等它重新启动的时候再停止一次, 就See Bye了)
最后, 咱最终还是本着决定权在用户手里的原则, 你要是真的让我走, 我绝不死机白咧, 但是我得知道, 你真的指的是我, 走, 也要走的唯一!
按常理的话, 题目的解释到这里就完成了.
但是我这人吧, 就喜欢多做一点点. 永远超出别人的预期. 吼哈....
有的人会想, 那我API18以后怎么办, 我, 我, 我也不知道撒...
但是我可以保证的是, 只要用户不删你的APP, 你的服务就可以一直是活动的.
<receiver android:name=".NotifyReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.TIME_SET" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.DATE_CHANGED" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.TIMEZONE_CHANGED" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<data android:scheme="package" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MEDIA_BAD_REMOVAL" />
<action android:name="android.intent.action.MEDIA_EJECT" />
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.MEDIA_REMOVED" />
<action android:name="android.intent.action.MEDIA_SCANNER_FINISHED" />
<action android:name="android.intent.action.MEDIA_SCANNER_STARTED" />
<action android:name="android.intent.action.MEDIA_SHARED" />
<action android:name="android.intent.action.MEDIA_UNMOUNTED" />
<data android:scheme="file" />
</intent-filter>
</receiver>
你注册这么个广播接收器, 在里面启动你的Service(当然启动的时候最好判断下是否启动), 除非用户不操作手机, 不安装, 不卸载, 网络环境一直不变化. 否则, 嘿嘿
What, 我这是在扇自己的脸吗. 我只是说有这么个方案, 当然不太建议大家去这么做, 简直太流氓了, 反正我是这么做了. 需求让人迷失自己!!! 迷失 Noooooooo, 程序员是没有自己的.
最后欢迎大家来到群: , 讨论有技术, 没技术的.
关于Service常驻内存不被清理的解决方法.的更多相关文章
- 「转载」关于Service常驻内存不被清理
http://www.cnblogs.com/fangyucun/p/3533731.html 作个记录
- Android几种Service常驻内存的小思路
老话说的好:躲得了初一,躲只是高三 ! 大多数的Android开发人员遇到的一个问题-怎样保证Service常驻内存. 近期我最终也在项目中务必幸运的遇到了 先来了解一下什么是Service常驻内存. ...
- 【转】 远程到服务器安装visualSVN server,出现Service 'VisualSVN Server' failed to start的解决方法
在帮助远程到服务器上安装visualSVN server的时候,出现Service 'VisualSVN Server' failed to start. 解决方法(先不要关闭安装弹出的错误窗口): ...
- ASP.NET Web Service中使用Session 及 Session丢失解决方法 续
原文:ASP.NET Web Service中使用Session 及 Session丢失解决方法 续 1.关于Session丢失问题的说明汇总,参考这里 2.在Web Servcie中使用Sessio ...
- Windows 系统提示“内存不足”的原因及解决方法
Windows 系统提示“内存不足”的原因及解决方法 windows XP vista 及windows 7系统的电脑有时候会出现系统提示“内存不足”,这是由多方面原因造成的.本文具体分析下 ...
- SQL执行SQL语句提示 "内存不足"(insufficient memory....)的解决方法
由于本地执行的sql script的文件太大但是本地sql的运行内存有限,当我在MSSql的工具上运行这份178M左右的脚本的时候 它会提示 如下错误(Insufficient memory to c ...
- SQL Server 2008 R2占用内存越来越大两种解决方法
SQL Server 2008 R2运行越久,占用内存会越来越大. 第一种:有了上边的分析结果,解决方法就简单了,定期重启下SQL Server 2008 R2数据库服务即可,使用任务计划定期执行下边 ...
- Android使用Handler造成内存泄露的分析及解决方法
一.什么是内存泄露? Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收.也就是说,一个对象不被任何引用 ...
- Android - 内存泄漏的情况以及解决方法
[译]Android内存泄漏的八种可能(上) Android防止内存泄漏的八种方法(下). Static Activities 在类中定义了静态Activity变量,把当前运行的Activity实例赋 ...
随机推荐
- CCMoveTo 等函数理解
CCMoveTo: 使用CCMoveTo action来让对象从右侧屏幕外移动到屏幕左侧.注意可以通过指定duration参数控制这一过程需要多久,这里我们随机给他2-4秒的时间. CCCallFun ...
- 《Python核心编程》 第五章 数字 - 课后习题
课后习题 5-1 整形. 讲讲 Python 普通整型和长整型的区别. 答:普通整型是绝大多数现代系统都能识别的. Python的长整型类型能表达的数值仅仅与你机器支持的(虚拟)内存大小有关. 5- ...
- 使用python的logging模块
一.从一个使用场景开始 开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件 import logging # 创建一个logger logger = logging.getLogger(' ...
- CentsOS7 网络自动启动
虚拟机中安装完成CentOS7后,网络总是需要手工启动才可使用,设置为自动连接的方式如下: cd /etc/sysconfig/network-scripts/ls #找到类似的文件:ifcfg-et ...
- spice
the following diagram illustrates VD-Interface illustrates display portemphasizing emphasizing e ...
- 第二百九十七天 how can I 坚持
算是在家宅了一天吧,下午睡了会觉,晚上一起做了个饭,中午一起吃的炒菜和徐斌他同学. 还是那么冷啊. 整天都是东扯西扯的. 睡觉. 忘了件重要的事,就是今天第一次喝鸡尾酒,还有,常人之所以是常人,不是因 ...
- TCMalloc优化MySQL、Nginx、Redis内存管理
TCMalloc(Thread-Caching Malloc)与标准glibc库的malloc实现一样的功能,但是TCMalloc在效率和速度效率都比标准malloc高很多.TCMalloc是 goo ...
- 【转】iOS可执行文件瘦身方法
http://blog.cnbang.net/tech/2544/ 缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我 ...
- BAT-使用BAT方法结束进程(删除进程)
@echo off taskkill /f /im GAM.exe taskkill /f /im GCL10.exe
- Oracle中纵横表的转化
横表就是普通的建表方式,如一个表结构为:主键.字段1.字段2.字段3......如果变成纵表后, 则表结构为:主键.字段代码.字段值.而字段代码则为字段1.字段2.字段3. 纵表对从数据库到内存的映射 ...