1、提升服务的优先级

AndroidAndroidManifest.xml 里面给服务增加优先级,通过content.StartService();方式启动服务。1000是最高值,如果数字越小则优先级越低。


<service android:name=".push.PushService">
  <intent-filterandroid:priority="1000">
        <action android:name="com.xsl.push"/>
  </intent-filter>
</service>

Intentintent = new Intent();
intent.setAction("com.xsl.push");
context.startService(intent );



2、在Android AndroidManifest.xml的application标签中添加android:persistent属性(把service写成系统服务)



<application
      android:icon="@drawable/app_default"
      android:label="@string/app_name"
      android:persistent="true" >
      ........................................
</application>

切记,这个不可滥用,系统中用这个的service,app一多,整个系统就完蛋了。


3、在Service的onDestroy()中重启Service.这种方式,用户在无法再设置-运行的服务中将此服务停止。


publicvoid onDestroy() {
  
  super.onDestroy();
       
  Intent localIntent = new Intent();
      localIntent.setClass(this, TestService.class); //销毁时重新启动Service
      this.startService(localIntent);
}

==============================================================


基本上大家都知道提高service优先级可以在很大程度上让你的service免于因为内存不足而被kill,当然系统只是在此时先把优先级低的kill掉,如果内存还是不够,也会把你的service干掉的。不过现在的机器不像几年前了,基本上不会发生那种情况。


先来看看网上常见的错误方法:


1.android:persistent="true"

对第三方app无效,下面是官方说明:


android:persistent 
  
 
   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.


 

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设置为前台进程。


1. Notification notification = new
2. notification.flags = Notification.FLAG_ONGOING_EVENT;  
3. notification.flags |= Notification.FLAG_NO_CLEAR;  
4. notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;  
5. service.startForeground(1, notification);

上面的三个属性放到一起,值为0x62。


1. /**
2.  * Bit to be bitwise-ored into the {@link #flags} field that should be
3.  * set if this notification is in reference to something that is ongoing,
4.  * like a phone call.  It should not be set if this notification is in
5.  * reference to something that happened at a particular point in time,
6.  * like a missed phone call.
7.  */
8. public static final int FLAG_ONGOING_EVENT      = 0x00000002;  
9. /**
10.  * Bit to be bitwise-ored into the {@link #flags} field that should be
11.  * set if the notification should not be canceled when the user clicks
12.  * the Clear all button.
13.  */
14. public static final int FLAG_NO_CLEAR           = 0x00000020;  
15.   
16. /**
17.  * Bit to be bitwise-ored into the {@link #flags} field that should be
18.  * set if this notification represents a currently running service.  This
19.  * will normally be set for you by {@link Service#startForeground}.
20.  */
21. public static final int FLAG_FOREGROUND_SERVICE = 0x00000040;

最后,我们可以使用下面命令看看手机中的哪些应用这么干了,你在平时使用的时候是不是他们存活时间最长,最不容易被系统干掉。

1. dumpsys notification



==============================================================