时间: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;