服务service是android的四大组件之一,常常用在看不见页面的高级场合,在后台执T行。Service与Activity相比,不同之处在于没有对应的页面,相同之处是都有自己的生命周期。首先我们先介绍下service的生命周期。
onCreate:创建服务的时候会触发
onStart:开始服务的时候触发,在Android2.0以下版本使用,现在已经废弃掉。
onStartCommand:开始服务的时候触发,Android2.0以上的版本使用,该函数有一些返回值需要说明一下:
返回值类型 | 返回值说明 |
START_STICKY | 粘性的服务,如果服务进程被杀掉,就保留服务的状态为开始状态,I单不保留Intent对象,随后系统尝试重新创建服务,由于服务状态为开始状态,因此创建服务后,一定会调用onStartCommond方法,如果在此期间没有任何启动命令传送给服务,参数Intent就为空值。 |
START_NO_STICKY | 非粘性的服务,使用这个返回值时,如果服务被异常杀掉,系统就会自动重启该服务。 |
START_REDELIVER_INTENT | 重传Intent的服务,使用这个返回值时,如果服务被异常杀掉,系统就不会自动重启该服务,并传入Intent的原值。 |
START_STICKY_COMPATIBILITY | START_ STICKY的兼容版,不保证服务被杀掉后一定能重启。 |
onDestory:销毁服务时候调用
onBind:绑定服务的时候调用
onRebind:重新绑定,该方法只有当上次onUnbind返回true的时候才能调用。
onUnbind:解除绑定,返回值位为true表示允许再次绑定,再绑定的时候调用onRebind方法。返回值为false时,只能绑定一次,默认返回false。
普通启停:
代码
public class SimpleService extends Service{
private static final String TAG="simpleService";
@override
public int onStartCommand(Intent intent,int flags,int startid){
return START_STICKY;
}
@override
public IBinder onBind(Intent intent){
return null;
}
}
在activity中启停服务很简单,直接调用startService ,调用stopService即可停止服务。当然,也可以在Intent对象中传递参数信息
eg:Intent intent =new Intent (this,SimpleService.class); startservice(intent)
值得注意的是,onCreat方法只会被调用一次,就是在创建的时候,如果连续调用startService方法,会连续执行onStartCommond
立即绑定:
绑定方式的服务定义有所不同,因为绑定的服务可能运行于另一个进程,所以必须定义一个Binder对象用来进行进程间的通讯。
代码
public class BindSimpleService extends Service{
private static final String TAG ="BindSimpleService";
private final IBinder mBinder=new LocalBinder();
public class LocalBinder extends Binder{
public BindSimpleService getService(){
return BindSimpleService.this;
}
}
@override
public IBinde(Intent intent){
return mBinder;
}
@override
public boolean onUnbind(Intent intent ){
return false;
}
}
在Activity 中,绑定或者解绑服务的做法与普通方式不同,首先要第一一个serviceConnection的服务连接对象,然后调用bindService方法或者unbindService方法进行绑定和解绑。
代码
public class BindTestActivity extend AppCompatActivity implements OnClickListence{
private static TextView tv_test;
private Intent mIntent;
@override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
..
..
mIntent= new Intent(this,BindTestActivity.class );
}
点击事件
@override
public void onClick (View v){
绑定
boolean bindFlag= bindService(mIntent,mFirstConn,Context.BIND_AUTO_CREATE);
解绑
if(null!=mBindService){
unBindServer(mFirstConn);
mBindService=null;
}
}
private BindSimpleService mBindService;
private ServiceConnection mFirstConn= new ServiceConnection(){
//获取服务对象时的操作
public void onServiceConnected(CompontentName name,IBindr service){
//r
}
}