Service可以长时间运行在后台、不提供用户界面,其他应用app也可以启动Service,即使用户切换到其他的app,Service依然可以运行。Service可跨进程。
一、使用service的方式
1、startService()
通过startService()启动Service,即使启动该Service的Activity被销毁了,Service会依然在运行。Service通常会执行一个操作不会给调用返回结果。
2、bindService()
其他组件通过bindService()方法绑定Service上。绑定式,可以认为:Client-Server。发送请求,获取数据,甚至可以进行进程间通信。该Service跟绑定到Service上的组件共存亡。某一时刻,可以有多个组件绑定在Service上,所有绑定在Service上的组件都解绑了,Service销毁。
启动的Service,还允许被绑定:实现两个回调方法,onStartCommand()、onBind()。
注意:Service运行在主线程。如果想要进行耗时、阻塞的操作,需要开线程。
创建绑定式service的三种方式:
1)继承Binder类
1.创建Binder类(子类)
a)应该有一个共有方法,让客户端调用
b)在该公有方法中返回一个Servic的实例
2.Binder的实例会从onBind()方法中返回
3.在客户端的onServiceConnected()中得到Binder实例
2)使用Messenger
可以用在进程间通信。在Service中定义Handler,处理Message。Messenger基于Handler,Messenger可以分享一个IBinder给客户端,可以发送指定到服务端使用message对象。
是进程间通信的最简单方式。
Messenger是Service的接口,
如何使用Messenger:
1.实现Handler
2.Handler用来创建Messenger对象
3.Messenger创建IBinder对象,并且把IBinder对象通过onBind()方法,返回给客户端。
4.客户端利用IBinder生成Messenger
5.客户端利用Messenger发送消息Message对象到服务器
6.在服务端,接收message在Handler中
3)AIDL:
1.把MBinder私有了
2.把要提供出去的方法,定义在接口(外部类)中Inter
3.把Inter 的.java文件改成.aidl文件
4.看到gen文件夹下的包中多了一个Inter.java,该文件中,有一个静态内部类Stub,继承了Binder,实现Inter
5.让MBinder继承Stub
客户端:
绑定是不变的,只不过,在onServiceConnected()方法中IBinder对象---》转换成接口Inter的对象:Stub.asInterfase(ibinser)
只要客户端拿到Inter的对象,就可以调用Service要提供出来的方法。
非同一个app使用/调用Service中的提供出来的方法,提供出来的方法规定在接口中。
把Server中定义的aidl文件拿过来,放在src文件夹下包中--》包名字必须和定义接口的包一模一样
其他代码跟同一app调用aidl服务---》一样
二、创建service
1、创建Service子类,重写方法,比较重要的需要重写的方法:
onStartCommand():另外一个组件调用startService()请求启动这个Service的时候,会调用该方法。一旦该方法执行了,Service就已经开启起来了,运行在后台,独立的。一旦Service的事情做完,应该停掉Service:stopSelf()、stopService().
onBind():另外一个组件通过调用bindService()方法想要绑定到Service上的时候,系统会调用onBind()方法。必须要返回一个接口IBinder,接口--》让绑定者跟Service交流。如果不允许其他组件绑定上来,返回null。
onCreate():Service第一次创建执行。该方法先于onStartCommand()、onBind()。
onDestroy():当Service不再被使用的时候,被销毁。通常情况下需要重写该方法,来清理一些东西:线程、监听……
一旦Service开启起来之后,将会保持运行,直到Service自己stopSelf()、其他组件调用stopService()
bindService()创建Service对象,该Service跟绑定者共存亡,所有的绑定者都解绑了,系统销毁Service
注册:
2、清单文件中,Application节点中添加子节点:Service---》name
跟Activity一样,也可以声明意图过滤器,让设备上的任意一个app都可以启动该Service
Service被声明为私有的:通过Exported属性false
三、生命周期
第一次startService的时候:
onCreate()、onStartCommand()-->传值
再次点击开启Service:
onstartCommand();--->继续传值
当系统内存过低的时候,系统为了恢复资源,就会强制停止Service,如果Service上绑定了一个位于界面最前面(拥有用户焦点)Activity,该Service被杀死的可能性比较小。如果Service被声明为前台Service,几乎不会被杀死。Service运行时间过长,随着时间的推移,系统杀死该Service的可能性会越来越大。系统内存资源恢复的时候,会重启Service(虽然系统会重启Service,还取决于onStartConmmand()方法)。合理设计重启操作。
生命周期方法:
StartService第一次:onCreate()、onStartCommand()
startService再次:onStartCommand()
stopService:onDestory()
版权声明:本文为博主原创文章,未经博主允许不得转载。