Android笔记—-Service
1.官方文档:
A Service is an application component that can perform long-running operations in the background and does not provide a user interface. Another application component can start a service and it will continue to run in the background even if the user switches to another application. Additionally, a component can bind to a service to interact with it and even perform interprocess communication (IPC).
大致说明,一个服务是一个在后台运行,没有与用户界面交互的应用组成.其他应用组件可以启动服务,并且让服务保持运行,即使用户切换到另一个应用.每个服务必须在AndroidManifest.xml中被声明.
- 新建类EchoService继承Service
- 在AndroidManifest.xml的标签添加
<service android:name="EchoService"></service>
声明. - 在MainAcitivity监听两个按钮 调用startservice启动服务,stopService()停止服务.
startButton.setOnClickListener(this);
stopButton.setOnClickListener(this);
————————————————–
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_startservice:
startService(serviceIntent);
break;
case R.id.btn_stopservice:
stopService(serviceIntent);
break;
default:
break;
}
}
接着在EchoService类重写Service类下的onCreate()和onDestory()方法,加入Log.i();查看服务状态.
运行之后发现当启动服务之后按Back按钮活动销毁之后,查看后泰应用程序,会发现服务还在运行.这个表明服务的生存周期和Activity是无关的.再次启动Activity并且Click停止活动按钮,服务才会onDestroy
- 服务的绑定
- 绑定服务和不绑定服务的区别:
如果服务绑定了Activity,一旦Activity停止,则服务会跟着停止.
在MainActivity实例化两个按钮bind_button和unbind_button
四个按钮都绑定监听器:
startButton.setOnClickListener(this);
stopButton.setOnClickListener(this);
bindButton.setOnClickListener(this);
unbindButton.setOnClickListener(this);
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_startservice:
startService(serviceIntent);
break;
case R.id.btn_stopservice:
stopService(serviceIntent);
break;
case R.id.btn_bind:
bindService(serviceIntent, this, Context.BIND_AUTO_CREATE);
break;
case R.id.btn_unbind:
unbindService(this);
break;
default:
break;
}
}
在EchoService类建立一个内部类, 并且新建对象echoServiceBinder
public class EchoServiceBinder extends Binder{
}
private final EchoServiceBinder echoServiceBinder = new EchoServiceBinder();
重写onBind方法并且返回echoServiceBinder
@Override
public IBinder onBind(Intent intent) {
Log.i("Service____", "OnBind");
return echoServiceBinder;
}
bindService是异步调用和Service进行绑定, 如果绑定成功, 则会调用ServiceConnection的onServiceConnected
当调用bindService方法后就会回调Activity的onServiceConnected,在这个方法中会向Activity中传递一个IBinder的实例,Acitity需要保存这个实例
在mainactivity重写onServiceConnected 成功绑定服务的时候会调用它
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("Service____", "onBind--连接服务");
}
运行程序:
1. 当你点击启动服务,Service会显示onCreate状态.当你点击停止服务,Service会显示Destory.
2.如果你不点击启动服务,直接点击绑定服务,Service会自动调用onCreate–>onBind–>onServiceConnected必须留意这个现象. 注意Service在destory之前只会onCreate一次,就是说如果之前已经点击过启动服务,则在绑定服务之前不会执行onCreate.
3.如果你通过bind来启动服务,则服务会跟随你Activity的状态生存,即是说,当你按Back退出活动之后,只要你之前已经Bind,则服务会随之退出,注意,如果只是启动服务没有绑定,则退出应用服务还是会在后台执行
4.在没有启动服务startService( )的前提下如果绑定之后按解绑按钮执行unbind则服务会destory,如果* 已经启动服务调用startService( )* 若要destory服务,则必须点击停止服务调用stopservice(),才能destory服务即使你按back退出Activity,服务还是不会destory.这一点结合3的区别就在于有没有启动服务调用startService( )
bind service的不同之处在于当绑定的组件销毁后,对应的service也就被kill了。
如何与服务进行通信
绑定服务的一个作用是为了可以和服务通信.
在EchoService类:
1. 新建一个内部类EchoServiceBinder继承自Binder
2. 定义EchoServiceBinder内部成员方法getService()返回当前服务实例
3. 并且新建一个该类的对象,在onBind()方法返回该对象
public class EchoServiceBinder extends Binder{
public EchoService getService(){
return EchoService.this;
}
}
private final EchoServiceBinder echoServiceBinder = new EchoServiceBinder();
@Override
public IBinder onBind(Intent intent) {
Log.i("Service____", "OnBind");
return echoServiceBinder;
}
- 在MainActivity:
在onServiceConnected()方法获取EchoService类对象:
echoService = ((EchoService.EchoSerivceBinder)binder).getService()
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
Log.i("Service____", "onBind--连接服务");
echoService = ((EchoService.EchoServiceBinder)binder).getService();
}
之后就可以通过该echoService实例获取其内部类成员,与之通信了.