服务Service
就是默默运行在后台的组件,可以理解为是没有前台的activity,适合用来运行不需要前台界面的代码
服务可以被手动关闭,不会重启,但是如果被自动关闭,内存充足就会重启
开启服务的两种方式
服务对象是不可以被new滴,只能依靠系统来创建服务对象
-
startService()
- 该方法启动的服务所在的进程属于服务进程。
- 服务一旦启动,服务便和活动没有关系
-
bindService()
- 该方法启动的服务所在的进程不属于服务进程。
- Activity与服务建立连接,服务与启动它的Activity同生共死
- 任何一个服务在整个应用程序范围内都是通用的,单例设计模式,一个服务可以和多个Activity绑定
- 绑定服务和解绑服务的生命周期方法:
onCreate
->onBind
->onUnbind
->onDestroy
活动和服务进行通信
使用
startService()
方式启动服务,服务是不能和活动进行通信,必须使用bindService()
方式启动服务(活动和服务进行绑定),才可以实现活动和服务进行通信
-
调用
bindService (Intent service, ServiceConnection conn, int flags)
方法将活动和服务进行绑定,此绑定方法有三个参数Intent service
:Intent意图对象ServiceConnection conn
:活动和服务的连接对象ServiceConnection
-
int flags
:一个标志位Intent intent = new Intent(this, MyService.class); bindService(intent, conn, BIND_AUTO_CREATE);
-
实现
ServiceConnection
接口,创建一个子类,实现接口的两个方法:onServiceConnected(ComponentName name, IBinder service)
和onServiceDisconnected(ComponentName name)
onServiceConnected(ComponentName name, IBinder service)
:服务连接成功时,此方法被调用-
onServiceDisconnected(ComponentName name)
:服务失去连接时,此方法被调用class MyConnection implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { //绑定服务时,返回的Binder对象 broker = (Broker)service; } @Override public void onServiceDisconnected(ComponentName name) { }
}
``` -
调用
bindService()
方法将活动和服务进行绑定,绑定的服务类中的public IBinder onBind(Intent intent)
方法会被系统调用,传入的参数是绑定给服务的Activity
,方法返回的是一个IBinder
对象,此对象可通过连接对象中的onServiceConnected(ComponentName name, IBinder service)
方法的参数IBinder service
向下转型得到,通过此对象就可以实现活动和服务进行通信class Broker extends Binder{ public void work(){ money(); } }
两种启动模式的混合使用
使用
startService()
方法启动的服务所在的进程属于服务进程,但活动和服务并没有进行连接,也无法去调用服务里的方法;使用bindService()
方法启动的服务所在的进程不属于服务进程,服务和启动此活动的服务同生共死,活动和服务进行了连接,可以调用服务内部的方法。
两种启动方式混合使用,调用
startService()
是为了使服务所在的进程属于服务进程,调用bindService()
是为了可以和服务进行通信先调用
startService()
方法创建并启动服务,再调用bindService()
方法绑定服务,欲销毁时,先调用unbindService()
方法解绑服务,再调用stopService
销毁服务