深入学习Service 2015-06-28 02:28 8人阅读 评论(0) 收藏

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()

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-06-28 02:28  merbng  阅读(159)  评论(0编辑  收藏  举报