Service作为Android四大组件之一,承载着重要的作用,同时,熟悉Service也会为理解Binder打下重要的基础,这里是我初学Android时做的关于Service的笔记,现在总结到这篇文章中。
安卓组件是什么意思
android中的service与Windows中的服务类似,一般没有用户界面,运行在后台,可以执行耗时的操作,是安卓四大组件之一。其他组件可以启动service,并且当用户切换另外的场景,service可以一直在后台运行。 服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,访问(启动)者与服务之间没有关连,即使访问(启动)者退出了,服务仍然运行。
采用Context.startService()方法启动服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。 使用bindService()方法启用服务,访问者与服务绑定在了一起,访问者一旦退出,服务也就终止。 service的运行是单例模式,只会实例化一次,开启一次之后再开启还是之前的那个对象,不会再新实例化。 Service和其他的应用组件一样,运行在进程的主线程中。这就是说如果service需要很多耗时或者阻塞的操作,需要在其子线程中实现。
创建服务步骤
创建一个类,继承servicepublic class MyService extends Service {
//必须实现方法,方法返回IBinder对象,应用程序可通过该对象与Service组件通信
public IBinder onBind(Intent intent) {
Log.i("Other", "MyService.onBind");
return null;
}
//生命周期方法,当Service第一次创建后将立即回调该方法
public void onCreate() {
super.onCreate();
Log.i("Other", "MyService.onCreate");
}
//当Service被关闭之前将回调该方法
public void onDestroy() {
super.onDestroy();
Log.i("Other", "MyService.onDestroy");
}
//每次客户端调用startService(Intent)方法启动该Service时都会回调该方法
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("Other", "MyService.onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
//当该Service上绑定的所有客户端都断开连接时将回调该方法
public boolean onUnbind(Intent intent) {
Log.i("Other", "MyService.onUnbind");
return super.onUnbind(intent);
}
在配置清单中注册该service
启动服务
服务不能自己启动,需要手动启动,有两种方法启动1、Context.startService(Intent)访问者与服务没有关联,即使访问者退出,服务仍然运行,若服务没启动:onCreate()-->onStartCommand(),如服务已经启动,直接调用onStartCommand()通过Context.stopService(Intent)关闭服务,调用此方法,此时若服务没启动:调用stopService()方法,service不做任何操作,若服务启动:调用onDestory()方法2、Context.bindService()访问者与服务绑定在一起,访问者一旦退出,服务终止? ? 以上创建了一个Service,只是重写了周期方法,若希望Service组件做某些事情,那么只要在onCreate()或onStartCommand()方法中定义相关义务代码即可
绑定本地Service并与之通信(进程内部绑定服务)
如果service与访问者需要进行方法调用或数据交换,则应该使用bindService()和unbindService()方法绑定、解绑服务。访问者与服务通过IBinder对象联系在一起,bindService()方法调用时,需要Intent,ServiceConnection和flag参数,其中serviceConnetion对象用于监听访问者与service之间的连接情况,用于接收服务onBind()方法返回的IBinder对象,IBinder中包含service传给调用者的数据。当连接成功时,serviceConnection()将回调方法onServiceConnected(Component Name,IBinder service);IBinder对象会传入其中。