android之service理解

来源:互联网 发布:2016网络流行成语 编辑:程序博客网 时间:2024/06/10 22:52

1,service的启动方式有2中,client通过startservice()或是bindservice()。详见:http://developer.android.com/reference/android/app/Service.html

(1)当通过startservice()启动service时,service会调用自己的oncreate()方法,然后onstartcommand()方法;这种方式的service运行模式有3种情况【For started services, there are two additional major modes of operation they can decide to run in, depending on the value they return from onStartCommand():START_STICKY is used for services that are explicitly started and stopped as needed,

while START_NOT_STICKY or START_REDELIVER_INTENT are used for services that should only remain running while processing any commands sent to them. 】当想要终止service运行时,client可以调用stopservice()或是service调用自己的stopself()。

(2)当通过bindservice开启service时,此时service不调用startcommand()方法启动,而是调用自己的onbind()方法,然后返回IBinder接口对象给client;在client在调用bindservice()前要先实例化serviceconnection接口对象并实现其中的方法,其中onserviceconnected方法来获取service返回的IBinder对象(此后就要通过这个Ibinder获取服务了),然后就是调用bindservice()方法了,方法原型:bindservice(intent service, serviceconnection conn, int flags);注意这种service提供服务可以通过继承binder并添加自己的服务方法。

(3)当实现RPC时,android提供了一种工具,AIDL可以帮我们免去一些繁琐的工作。android会根据aidl文件生成一个java接口类,此接口类中有一个内部类(stub类),我们在service中继承此类,而后实例化此类,在service调用onbind()方法时将此实例对象返回给client。client就可以提供这个对象来实现服务了。

(4)onstartConmmand()的返回值,

1,START_NOT_STICKY:如果系统在onStartCommand方法返回之后杀死这个服务, 那么知道接受新的intent重新启动此service,这是最安全的启动方式,用来在不需要的时候运行你的service。(重新启动会执行onstartCommand);

2,START_STICKY:如果系统在onStartCommand方法返回之后杀死这个服务,那么系统会重新以一个null的intent启动此service,这种方式是一种无限期的等待任务的到来。(重新启动会执行onstartCommand);

3,START_REDELIVER_INTENT:如果系统在onStartCommand方法返回之后杀死这个服务,那么系统就用最后发送给此service的intent来重新启动该service,任意等待中的intent也会依次被发送来处理。(重新启动会执行onstartCommand);

(5)IntentService和Service的区别:IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程,这里就给我们提供了一个思路,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作。而在一般的继承Service里面如果要进行耗时操作就必须另开线程,但是使用IntentService就可以直接在里面进行耗时操作,因为默认实现了一个worker thread。对于异步的startService请求,IntentService会处理完成一个之后再处理第二个。

(6)具体结合android官网讲解http://developer.android.com/guide/components/services.html

0 0
原创粉丝点击