码迷,mamicode.com
首页 > 其他好文 > 详细

创建不被杀死的service

时间:2014-08-04 14:28:27      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:android   des   style   blog   http   color   java   使用   

    

          service 在android app里 应用 越来越多,特别是联网的app中,不管app是否启动,总需要一个service来维护与后台数据的连接,接收服务端的推送,获取及时的数据信息。

   可是 service 总是在后台不知不觉的别系统回收 或者被 一些优化软件 给 “优化”了,怎么解决这个问题?

  

    查资料 找到了  Service对象的onStartCommand(Intent,int,int)方法 ,此方法介绍:

  

  

onStartCommand有4种返回值:

START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。

START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。

START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。

START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。



写个简单的验证程序 看看service 被kill掉后 是否会重新启动:


public class AutoRunService extends Service {

	private static AutoRunService msService = null;
	private Thread mThread;
	private static boolean isRun;
	private static float num=0;
	@Override
	public void onCreate() {
		super.onCreate();
		Log.d("mservice", "onCreate");
		   msService = this;
		   isRun=true;
		  
			num=0;
			if(mThread==null){
				mThread=new Thread(runnable);
			}
			if(!mThread.isAlive()){
				mThread.start();
			}
	}
	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return null;
	}
   
	 @Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		  Log.d("mservice", "onStartCommand");
		 return START_STICKY;
	}
	 
	 @Override
	public void onStart(Intent intent, int startId) {
		 Log.d("mservice", "onStart");
		super.onStart(intent, startId);
		
		
	}
	 
	 @Override
	public void onDestroy() {
			Log.d("mservice", "onDestroy");
		super.onDestroy();
	  //  restartService(this);
	    msService=null;
	    isRun=false;
	}
	 
	 public static AutoRunService getService() {
	        return msService;
	    }
	 
	 public Runnable runnable=new Runnable() {
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			while(isRun){
				SystemClock.sleep(1000);
				num+=1;
				 Log.d("mservice", "i am run  times="+num);
			}
		}
	};
	 
}


  启动service:

  

  

protected void onCreate(Bundle savedInstanceState) {
	// TODO Auto-generated method stub
	super.onCreate(savedInstanceState);
	Log.d("mservice", "activity onCreate");
	Intent intent =new Intent(this, AutoRunService.class);
	this.startService(intent);
}

 启动 程序  有log 输出:


 bubuko.com,布布扣


  杀死  service;

   

  bubuko.com,布布扣


等待了一段时间   service 果然重新启动:


bubuko.com,布布扣


看重启时间 和杀死 service时间间隔 30秒 ,多试了几次   重启时间在 0-300秒之间, 测试手机 是 htc one,理论上来说 重启时间是不确定的,所以如果想做更

安全的保障,建议 加上 开机 和解锁的 广播接收,在那里再做进一步的service 启动, 如果要求不高,上面的即可满足。

创建不被杀死的service,布布扣,bubuko.com

创建不被杀死的service

标签:android   des   style   blog   http   color   java   使用   

原文地址:http://blog.csdn.net/soouoo/article/details/38367199

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!