1、提升服务的优先级
<service android:name=".push.PushService">
</service>
Intentintent = new Intent();
intent.setAction("com.xsl.push");
context.startService(intent );
2、在Android AndroidManifest.xml的application标签中添加android:persistent属性(把service写成系统服务)
<application
</application>
切记,这个不可滥用,系统中用这个的service,app一多,整个系统就完蛋了。
3、在Service的onDestroy()中重启Service.这种方式,用户在无法再设置-运行的服务中将此服务停止。
publicvoid onDestroy() {
}
==============================================================
基本上大家都知道提高service优先级可以在很大程度上让你的service免于因为内存不足而被kill,当然系统只是在此时先把优先级低的kill掉,如果内存还是不够,也会把你的service干掉的。不过现在的机器不像几年前了,基本上不会发生那种情况。
先来看看网上常见的错误方法:
1.android:persistent="true"
对第三方app无效,下面是官方说明:
-
Whether or not the application should remain running at all times — "
true
" if it should, and "false
" if not. The default value is "false
". Applications should not normally set this flag; persistence mode is intended only for certain system applications.
android:persistent
2.onDestroy中重启service
service被系统杀死的时候并不一定会执行onDestroy,拿什么重启?
3.android:priority
service根本没有这属性。
4.setForeground
这个是有效的,但是网上的例子却都是无效的原因是参数错误。
让service免于非难的办法是提高它的重要性,在官方文档中已经说明进程有五个级别,其中前台进程最重要,所以最后被杀死。
如何使之变成前台进程可以参阅官方文档。
http://developer.android.com/guide/components/processes-and-threads.html
http://su1216.iteye.com/blog/1591699
这里只说如何使用setForeground将service设置为前台进程。
- Notification notification = new Notification();
- notification.flags = Notification.FLAG_ONGOING_EVENT;
- notification.flags |= Notification.FLAG_NO_CLEAR;
- notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;
- service.startForeground(1, notification);
- /**
- * Bit to be bitwise-ored into the {@link #flags} field that should be
- * set if this notification is in reference to something that is ongoing,
- * like a phone call. It should not be set if this notification is in
- * reference to something that happened at a particular point in time,
- * like a missed phone call.
- */
- public static final int FLAG_ONGOING_EVENT = 0x00000002;
- /**
- * Bit to be bitwise-ored into the {@link #flags} field that should be
- * set if the notification should not be canceled when the user clicks
- * the Clear all button.
- */
- public static final int FLAG_NO_CLEAR = 0x00000020;
- /**
- * Bit to be bitwise-ored into the {@link #flags} field that should be
- * set if this notification represents a currently running service. This
- * will normally be set for you by {@link Service#startForeground}.
- */
- public static final int FLAG_FOREGROUND_SERVICE = 0x00000040;
- dumpsys notification
==============================================================