创建不被杀死的service

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 输出:

杀死  service;

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

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

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

创建不被杀死的service

时间: 2024-10-10 17:11:37

创建不被杀死的service的相关文章

Android中如何像 360 一样优雅的杀死后台Service而不启动

http://my.oschina.net/mopidick/blog/277813 目录[-] 一.已知的 kill 后台应用程序的方法 方法: kill -9 pid 二.终极方法,杀死后台service而不自启动: am (Activity Manager)命令 一.已知的 kill 后台应用程序的方法 android.os.Process.killProcess(pid); activityManager.killBackgroundProcesses(pkgName); kill -9

如何创建和发布.asmx Web Service

创建和发布Web ServiceWeb服务方法中可以返回一个DataSet对象 WEB服务可以说是下一代WEB应用程序的基础,无论客户端是WINDOWS应用.ASP.NET Web Form程序.甚至其他语言的客户端,都可以与同一个WEB服务通信,其平台和语言无关性使其有了广阔的发展空间. 利用VS2005和IIS我们可以很容易地发布一个WEB SERVICE 环境:Windows Server 2003,.Net FrameWork 2.0,IIS6.0 工具:VS2005 1.首先VS200

创建BDC(Business Data Connectivity Service)

创建Business Data Connectivity http://blog.csdn.net/spfarm/article/details/44015915 创建和使用Business Data Connectivity Service: http://www.cnblogs.com/mingmingruyuedlut/archive/2012/11/24/2784412.html 新建外部内容类型.解决访问被拒绝的问题: 在SharePoint Designer中创建外部内容类型,访问被

Kivy A to Z -- 如何从Python创建一个基于Binder的Service及如何从Java访问Python创建的Service

<Kivy A to Z -- 如何从python代码中直接访问Android的Service> 一文中讲到了如何从python访问java的service,这一篇再来讲下如何创建一个基于Binder的Python Service以及如何从Java代码中访问这个Python创建的Service. 先来看代码,再作下解释: 接<Kivy A to Z -- 如何从python代码中直接访问Android的Service>一文,我们在相关的文件中增加代码: binder_wrap.cp

【Java 新建项目】使用程序对新项目的各个实体 创建Dao、DaoImpl、Service、ServiceImpl层的文件

首先给出基本Dao层代码: GenericDao.java 1 package com.agen.dao; 2 3 import java.io.Serializable; 4 import java.util.Collection; 5 import java.util.List; 6 import java.util.Map; 7 8 import org.hibernate.Criteria; 9 import org.hibernate.criterion.Criterion; 10 i

aws 创建基于vpc的elasticsearch service

1.创建vpc 2.创建安全组 3.创建elasticsearch域 (1)选择elasticsearch版本 (2)配置集群和存储.建议启用2个专用主节点,增加可用性.实例类型根据需要来选择 (3)设置访问权限.这里选择在第一步和第二步中创建的vpc和安全组 (4)设置访问策略.这里选择请勿要求使用IAM凭证对请求签名. (5) 设置安全组 因为aws上的elasticsearch地址是相当于一个负载均衡,后端的elasticsearch的9200端口是访问不到的.这里安全组设置的时候,选择所

android Service 保持不被杀死

Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStartCommand方法中做一些处理. 从Android官方文档中,我们知道onStartCommand有4种int返回值,首先简单地讲讲int返回值的作用. 一.onStartCommand有4种返回值: START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,

如何保证Service不被杀死一直运行

Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStartCommand方法中做一些处理. 从Android官方文档中,我们知道onStartCommand有4种int返回值,首先简单地讲讲int返回值的作用. 1.修改onStartCommand(..)方法的返回值 onStartCommand有4种返回值: START_STICKY:如果service

android面试题目

最近才开的博客,希望大家多多关注,andorid开发也做了3年有余了,也面试多家企业,借此机会分享一下,我们中遇到过的问题以及解决方案吧,希望能够对正在找工作的andoird程序员有一定的帮助.学完<andorid从零开始教程>+面试题目全理解,年薪20w以上绝对没问题. 特别献上整理过的50道面试题目 1.listView的优化方式 重用convertView viewHolder static class viewHolder 在列表里面有图片的情况下,监听滑动不加载图片 多个不同布局,可