出门莫恨无人随,书中车马多如簇。这篇文章主要讲述Android四大组件之Service相关的知识,希望能为你提供帮助。
android赋予Service比处于非活动状态的Activity更高的优先级,当系统请求资源时她们被终止的可能性更小。如果在运行时过早地终止了一个已经启动的Service,只要有足够的资源可用,则运行时会重新启动它。为了应对一些终止Service会显著影响用户体验的极端情况(如音乐播放器),必要时Service的优先级可以升级到和前台的Activity一样高。
虽然Service没有专门的GUI,但它们还是运行在应用程序的主线程中。
一、创建和控制Service
1.
Service创建
- 创建集成自Service的类并重写onCreate和onBind方法
- 将该Service在Manifest文件中进行注册。
重写onStartCommand事件处理程序以执行一个由Service封装的任务。在这个处理程序中可以指定Service的重新启动行为。当一个Service通过onStartService启动时就会调用onStartCommand方法,该方法在Service的生命周期内会执行多次。
public int onStartCommand (Intent intent, int flags, int startId) {
......
return Service.START_STICKY;
}
返回值控制当Service被运行时终止后系统如何响应Service的重新启动。
- START_STICKY 重新启动的标准行为,运行时终止Service后重新启动调用onStartCommand,但传入的Intent为null,多用于处理自身状态的Service以及通过startService和stopService显示地启动和终止的Service。
- START_NOT_STICKY Service被运行时终止后只有当存在未处理的启动调用时设为这个模式的Service才会重新启动。终止Service后若没有进行startService调用则Service会停止运行。多用于定期更新或网络轮询。
- START_REDELIVER_INTENT 前两种模式的组合,当Service被运行时终止后,只有当存在未处理的启动调用或者进行在调用stopSelf之前被终止时才会重新启动Service,在后一种情况中将会调用onStartCommand但并不会传入没有正常处理完成的Intent.
启动Service:通过Intent显示或隐示启动 startService(intent)
停止Service:stopService(intent)
自终止Service:Service完成操作或处理后调用stopSelf来终止它。可以不传递参数也可以传递一个startId值保证已经为目前调用的每个startService实例完成了处理。
4.将Service绑定到Activity
Service和Activity绑定后Activity会维护对Service实例的引用,对Service进行方法调用。
Service支持绑定需要实现onBind方法并且返回绑定Service的当前实例。
要将Service和其他组件进行绑定,需要实现一个新的ServiceConnection。建立连接之后可以通过重写onServiceConnected和onServiceDisconnected得到对Service实例的引用。
要执行绑定需要在Activity中调用bindServide并传递给他一个要绑定的Service的Intet以及一个ServiceConnection实例。
Service和应用程序绑定时的标志位
- BIND_ADJUST_WITH_ACTIVITY 系统可根据所绑定的Activity的重要程度来调整Service的优先级
- BIND_IMPORTANT和BIND_ABOVE_CLIENT 当客户端处于前台时,Service也应该变为前台进程。BIND_ABOVE_CLIENT指在内存极低的情况下运行时会先终止Activity再终止Service
- BIND_NOT_FOREGROUND Service永远不会拥有前台的优先级
- BIND_WAIVE_PRIORITY 绑定指定的Service不应该改变Service的优先级
【Android四大组件之Service】 通过Service的startForeground方法可以设置Service在前台运行,但是由于其会与用户交互,所以需要指定一个持续工作的Notification,只要Service在前台运行,这个通知就会显示。当Service不再需要前台运行的优先级时可以通过stopForeground将其移到后台。
推荐阅读
- CSDN日报20170220——《从安卓调整到服务端后的思考》
- android 集成QQ互联 (登录,分享)
- Android网络编程之——文件断点下载(暂停/继续/重新下载)
- android 垃圾回收机制
- 关于Android软键盘把布局顶上去的问题
- android4.3 Bluetooth(le)分析之startLeScan分析
- android4.3 Bluetooth分析之扫描分析
- android:process=":remote"属性解说
- Android中的多线程开源框架