Service是Android系统的核心组件之一,是由系统进行管理和维护的。


【定位】 Service是没有界面的; Service适合在后台执行长时间的任务; Service是单例的; 注意:Service是运行在主线程的,所以,如果需要让Service执行耗时操作,需要在Service中开启子线程来完成 【创建步骤】 1. 继承:自定义类继承自android.app.Service类 2. 注册:在AndroidManifest.xml的<application>节点下,添加<service>节点,并配置该节点的android:name属性完成注册


启动模式的Service


【启动Service】 调用startService(Intent)方法即可启动Service 【停止Service】 1. 调用stopService(Intent)方法即可停止Service 2. 在Service内部调用stopSelf()方法可停止Service 【Service的生命周期】 onCreate() -> 当创建时,该方法仅当第1次启动时被调用 onStartCommand() -> 当开始执行某个指令时,该方法在每次启动时都会被调用 onDestroy() -> 当销毁时,该方法在Service被停止后执行 【Service的粘性】 Service的粘性表现为:当Service被意外终止时,会自动重启。 Service是否粘性,是根据onStartCommand()方法的返回值决定的,取值为Service类的常量: START_STICKY -> 粘性的 START_STICKY_COMPATIBILITY -> 兼容模式的粘性的 START_NOT_STICKY -> 非粘性的 START_REDELIVER_INTENT -> 粘性的,且重新传递Intent


绑定模式的Service


绑定模式的Service是实现其它组件,例如Activity,与Service实现绑定关系,当实现了绑定关系后,Activity可以和Service实现组件之间的通信。 【绑定流程】 1. 创建WorkService类,继承自Service 2. 注册Service 3. [Activity] 声明内部类InnerServiceConnection,实现ServiceConnection接口 4. [Activity] 调用bindService()方法实现绑定,其中,方法的第1个参数是Intent对象,用于指定被激活的组件,第2个参数以上第3个步骤的内部类对象,且应该被声明为全局变量,第3个参数取值为常量BIND_AUTO_CREATE 5. [IMusicPlayer] 声明新的接口文件IMusicPlayer,并在接口中声明那些由Service实现、由Activity调用的方法,例如void play()等等 6. [Service] 声明内部类InnerBinder,继承自Binder,实现IMusicPlayer接口 7. [Service] 在onBind()中,创建InnerBinder的对象,作为该方法的返回值 8. [Activity] 声明IMusicPlayer的全局变量player,该变量的值将在InnerServiceConnection的onServiceConnected()方法中,根据第2个参数强制类型转换得到。 9. [Activity] 在需要的时候,通过player执行各种已经在接口中声明的方法,而这些方法最终都会是Service在运行的 【绑定的Service的生命周期】 onCreate() -> 当创建时,第1次绑定时被调用 onBind() -> 当绑定时,第1次绑定时被调用 onDestroy() -> 当销毁时,解除绑定时被调用 【解除绑定】 可以通过unbindService(ServiceConnection)解除绑定。 注意:如果Activity绑定了Service,在没有解除绑定之前,直接退出Activity会导致错误(该错误不会显示在手机上)。


进程的优先级
在Android系统中,当内存资源不足时,系统会自动清理一部分已经打开的应用程序占用的内存空间,以保证有足够的内存来运行用户当前需要运行的程序。在自动清理的过程中,会根据各进程的优先级,优先清理优先级较低的进程。
进程的优先级从高到低分别是:
1. 前台进程:进程中存在可见并可控的Activity,或进程中存在绑定了前台进程的Service
2. 可见进程:进程中存在局部可见(可见却不可控的)的Activity,或进程中存在绑定了可见进程的Service
3. 服务进程:存在正在执行的Service的进程
4. 后台进程:进程中所有的Activity都被置于后台
5. 空进程:被销毁的进程