首页 > 技术文章 > Android四大组件Service的基本知识:

yuzhongzheng 2016-02-29 18:08 原文

时间:2015年12月28日15:48:05

      生命周期:
          

     注意事项:
          1. service需要在manifest.xml文件中注册:
               <service
                      android:name=".service.MyService"
                      android:enabled="true"
                      android:exported="false">
               </service>

               对于xml的配置,官方有些建议:
- 为了确保应用的安全性,请始终使用显式 Intent 启动或绑定 Service,且不要为服务声明 Intent 过滤器。
- 添加 android:exported 属性并将其设置为 "false",确保服务仅适用于您的应用。这可以有效阻止其他应用启动您的服务,即使服务提供了intent过滤器,本属性依然生效。

          2. bindService(intent,con, Service.BIND_AUTO_CREATE);
                bindService的参数BIND_AUTO_CREATE表示在Activity和Service建立关联后自动创建Service,这会使得MyService中的onCreate()方法                                                     得到执行,但onStartCommand()方法不会执行。

          3.startService
               使用startService启动service:
                    第一次启动service会调用onCreate,onStartCommand,而后面再次startService则不会再调用onCreate而是onStartCommand,并且每次startId不同.
            stopService
               调用stopService,情况如下:
- 如果service已经通过startService启动,则onDestroy
- 如果service没启动,则没什么效果

 4.不同于startService,bind调用后,设置-正在运行里是看不到有Service运行着的.

5.如果没用bindService启动过service(注意:即使是startService启动的也不行),直接调用unbindService,则会崩溃:
               java.lang.IllegalArgumentException: Service not registered: yifeiyuan.practice.practicedemos.service.ServiceActivity$1@535f696c

          6.如果不调用onUnbind,直接关掉Activity,跟unBind效果一样,也就是说两者生命周期相同,共存亡.

          7.多个启动服务的请求将会引发服务onStartCommand()方法的多次调用。不过,只有一个终止服务的请求(用stopSelf()或stopService())会被接受并执行。

     服务有以下两种基本类型:

Started
如果一个应用程序组件(比如一个activity)通过调用startService()来启动服务,则该服务就是被“started”了。一旦被启动,服务就能在后台一直运行下去,即使启动它的组件已经被销毁了。 通常,started的服务执行单一的操作并且不会向调用者返回结果。比如,它可以通过网络下载或上传文件。当操作完成后,服务应该自行终止。

Bound
如果一个应用程序组件通过调用bindService()绑定到服务上,则该服务就是被“bound”了。bound服务提供了一个客户端/服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至可以利用进程间通信(IPC)跨进程执行这些操作。绑定服务的生存期和被绑定的应用程序组件一致。 多个组件可以同时与一个服务绑定,不过所有的组件解除绑定后,服务也就会被销毁。

     Traditionally, there are two classes you can extend to create a started service:
          Service
               这是所有服务的基类。如果你要扩展该类,则很重要的一点是:请在其中创建一个新的线程来完成所有的服务工作。 因为服务默认是使用应用程序的主线程的,这会降低应用程序中activity的运行性能。

          IntentService
               这是Service类的子类,它使用了工作(worker)线程来处理所有的启动请求,每次请求都会启动一个线程。 如果服务不需要同时处理多个请求的话,这是最佳的选择。 所有你要做的工作就是实现onHandleIntent()即可,它会接收每个启动请求的intent,然后就可在后台完成工作。

     onStartCommand()方法必须返回一个整数:
这个整数是描述系统在杀死服务之后应该如何继续运行(上一节中缺省的 IntentService 实现代码会替你处理这一点,当然那样你就无法修改这个处理过程)。onStartCommand()的返回值必须是以下常量之一:

          START_NOT_STICKY
               如果系统在onStartCommand()返回后杀死了服务,则不会重建服务了,除非还存在未发送的intent。 当服务不再是必需的,并且应用程序能够简单地重启那些未完成的工作时,这是避免服务运行的最安全的选项。

          START_STICKY
               如果系统在onStartCommand()返回后杀死了服务,则将重建服务并调用onStartCommand(),但不会再次送入上一个intent, 而是用null intent来调用onStartCommand() 。除非还有启动服务的intent未发送完,那么这些剩下的intent会继续发送。 这适用于媒体播放器(或类似服务),它们不执行命令,但需要一直运行并随时待命。

          START_REDELIVER_INTENT
               如果系统在onStartCommand()返回后杀死了服务,则将重建服务并用上一个已送过的intent调用onStartCommand()。任何未发送完的intent也都会依次送入。这适用于那些需要立即恢复工作的活跃服务,比如下载文件。

     service和intentService:
          service:
     1.Service不是一个单独的进程 ,它和应用程序在同一个进程中
  2.Service不是一个线程,所以我们应该避免在Service里面进行耗时的操作
intentService:
     (1)会创建独立的worker线程来处理所有的Intent请求;
     (2)会创建独立的worker线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题;
     (3)所有请求处理完成后,IntentService会自动停止,无需调用stopSelf()方法停止Service;

     
             


来自为知笔记(Wiz)


推荐阅读