1. Service作为Android的常用组件之一用途还是非常广的,常被用来表示后台服务,没有与用户进行交互。比如我们熟悉的音乐播放器服务,或者后端下载的服务;
我们知道Service的启动方式有:
a. startService
b. bindService
2. 说一下service的生命周期,有如下的回调
onCreate, onStartCommand(onStart已经废弃),onBind, onUbind, onDestory
说一下startService和bindService的关系和区别;
a. service作为组件,一定是需要在AndroidManifest.xml中进行注册的。
b. 通过context.startService来启动的service,会在第一次调用时回调onCreate,并且该service将会在后台运行,只有在显示调用stopService或者在service中调用stopself方法才能停止service。若调用startService多次,onCreate只有在第一次实例service时会被触发,其他的调用会触发onStartCommand回调。
c. 通过context.bindService来连接service来启动,那么此service将于context进行绑定,除非显示调用context.unbindService或者bind service的那个context已经不存在了,service才会被停止。
d. startService启动的service,可以执行多次stopService, 而bindService启动的service,可以调用多次的bindService,但是只有第一次bind时,才会回调onCreate, onBind; 而且bind的service,只能调用一次unbindService来解绑,调用多次,会产生运行时异常。
3. 分析一下Service的属性标签
Android:name 描述service的名称;
Android:enable: 这个属性用于指示该服务是否能够被实例化。如果设置为true,则能够被实例化,否则不能被实例化。默认值是true。<application>元素有它自己的enabled属性,它的这个属性适用于应用中所有的组件,包括service组件。对于被启用的服务,<application>和<service>元素的enabled属性都必须是true(默认值都是true)。如果有一个元素的enabled属性被设置为false,该服务就会被禁用,而不能被实例化。
Android:exported: 这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。如果设置为true,则能够被调用或交互,否则不能。设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。
1.3 bindservice的serviceConnection说明;
在调用bindService时,要传递一个类型为serviceConnection的参数,该接口类有两个接口方法如下:
public void onServiceConnected(ComponentName name, IBinder service);
当连接service的已经建立,会回调此方法;
Name: 连接的service的componentName;
Service: Ibinder,在连接时,回调onbind返回的ibinder;
public void onServiceDisconnected (ComponentName name);
调用时机:当service因为进程被杀掉;