Android Service保活方法总结

在Android开发中我们经常会需要让一个Service长久的存活下去,直到海枯石烂,但是总有一些刁民想干掉朕的服务,比如手机内存不足、应用被关闭、重启手机、手机息屏被释放内存、手动清理内存等……
因此我们要保证一个Service长久存活下去就需要解决掉上面说的这些刁民。下面介绍几种常用的服务保活的方法。
1 onStartCommand方法,返回START_STICKY
在运行onStartCommand后service进程被杀死后,那将保留在开始状态,但不会保留那些传入的intent。不久后service就会再次尝试重新创建,因为保留在开始状态,在创建 service后将保证调用onstartCommand。如果没有传递任何开始命令给service,那获取到的Intent为null。手动返回START_STICKY,亲测当service因内存不足被kill,当内存又有的时候,service又被重新创建,但是不能保证任何情况下都被重建,比如进程被干掉了…. 
2 提升Service优先级
在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = “1000”这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。
3 提升Service进程优先级
Android中将进程分成6个等级,由高到低分别是:前台进程、可视进程、次要服务进程、后台进程、内容供应节点以及空进程。当系统进程空间紧张时,会按照优先级自动进行进程回收。可以使用startForeground()将服务设置为前台进程。在onStartCommand中添加如下代码:

    Notification.Builder builder=new Notification.Builder(this);
        builder.setSmallIcon(R.mipmap.ic_launcher);
        builder.setTicker("uploadservice");
        builder.setContentText("请保持程序在后台运行");
        builder.setWhen(System.currentTimeMillis());
        intent=new Intent(this,MainActivity.class);
        PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
        builder.setContentIntent(pendingIntent);
        NotificationManager manager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notification=builder.build();
        startForeground(1,notification);

在onDestory加上:

 stopForeground(true);

4 在onDestory中重启Service
直接在onDestroy()里startService或service +broadcast 方式,就是当service走ondestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service。
代码如下:

Intent intent=new Intent("com.my.learn.code.BaseService");
startService(intent);

service+broadcast方式:
1.定义一个广播:

    public class BaseReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals("com.my.learn.code.basereceiver")){
                Intent sintent=new Intent("com.my.learn.code.BaseService");
                startService(sintent);
            }
        }
    }
    <receiver android:name="com.my.learn.code.BaseReceiver" >  
        <intent-filter>  
            <action android:name="android.intent.action.BOOT_COMPLETED" />  
            <action android:name="android.intent.action.USER_PRESENT" />  
            <action android:name="com.my.learn.code.basereceiver" />//这个就是自定义的action  
        intent-filter>  
    receiver>  

在onDestory中:

Intent intent = new Intent("com.my.learn.code.basereceiver");  
    sendBroadcast(intent);  

5 监听系统广播判断Service状态
通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活,但要记得加权限。代码如下:

   public class MonitorReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
                Log.v(TAG,"手机开机");
                Intent sintent=new Intent("com.my.learn.code.BaseService");
                startService(sintent);
            }
            if (Intent.ACTION_USER_PRESENT.equals(intent.getAction())) {
                Log.v(TAG,"解锁");
                Intent sintent=new Intent("com.my.learn.code.BaseService");
                startService(sintent);
            }
        }
    }
    "com.my.learn.code.MonitorReceiver" >  
      
        "android.intent.action.BOOT_COMPLETED" />  
        "android.intent.action.USER_PRESENT" />  
        "android.intent.action.PACKAGE_RESTARTED" />  
        "com.my.learn.code.monitor" />
      
 

6 将APK安装到/system/app,变身系统级应用
这种方式适合调试来用,并不算是一种解决办法,不推荐使用,因为你的APP是给用户使用的。

你可能感兴趣的:(Android学习笔记)