Android基础知识总结---四大组件之一Service(一)
2016-07-13 22:48
1171 查看
一:Service的概述
Service是Android四大组件中与Activity最相似的组件。都代表执行程序,Service与Activity的区别在于:Service一直在后台运行,它没有用户界面,所以绝不会到前台来。一旦Service被启动起来之后,它就与Activity一样。完全具有自己的生命周期。
关于程序中Activity和service的选择标准:
如果某个程序组件需要在运行时向用户呈现某种界面,或者该程序需要与用户交互,就需要使用Activity,否则就应该考虑使用Service了。 如:下载东西,播放音乐。可以一边下载,一边播放,一边玩其他的事情。但是Activity是无法做到的。只要Activity被关闭或者最小化了,程序就停止了。
二:Service的特点
1.没有UI2.进行耗时较长或者与用户没有交互的一些功能
3.Service具有较高的优先级比stop的Activity优先级要高,最高优先级的是前台的Activity
4.具有较长的生命周期
三:Service的生命周期
同样的Service也有自己的生命周期,而且随着Service的启动方式的不同,他的生命周期也略微不同:第一种方式:通过调用startService()方法启动
onCreate()–onStartCommand()/onStart()–onDestory()
a)onCreate()创建Service实例时的回调函数,启动的Service实例如果不存在会触发一次之后不会触发.
b)onStartCommand(Intent intent, int flags, int startId) 启动Service时的回调函数每次启动都会触发
//第一个参数是意图//第二个参数是标志位(启动Service时传递过来的)//第三个参数是启动该Service的次数
//返回值指定 Service被异常Kill掉后的重启行为,如果你实现onStartCommand()来安排异步工作或者在另一个线程中工作,
那么你可能需要使用START_REDELIVER_INTENT来让系统重新发送一个intent,这样被kill掉的Service会自动重启
如果return Service.START_NOT_STICKY,此时被kill掉的Service将不会重启
c)onStart():启动Service时,该方法已经被淘汰了。
d)onDestory():人为调用stopService(intent)方法销毁Service实例回调该方法
注意:
onStartCommand()的返回值用来指定Service的系统在用户为手动关闭Service前自动回收Service资源情况下的重启行为:
a)START_STICKY
如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
b)START_NOT_STICKY
“非粘性的”。如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
c)START_REDELIVER_INTENT
使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
d)START_STICKY_COMPATIBILITY:
START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
第二种方式:通过调用bindService()方法启动
onCreate()—>onBind()—>onUnbind()—>onDestory().
a)onCreate() 同startService
b)onBind() 在Service与调用者建立关联关系时使用,该方法会返回一个IBinder类型的实例给调用者,作为Service在调用者的代理.
c)onUnbind() Service与调用者解除绑定时回调
d)onDestory() 同startService
e)onRebind() 与调用者重新建立连接时回调
注:
关于Service的停止:针对不同启动方式,可以使用两种方式在调用者中手动关闭Service,分别是:
1)stopService(Intent it);
2)unbindService(ServiceConnection conn)
四:Service的使用
1)创建:创建类去继承Service,实现OnBind()方法。Service与Activity都是从Context派生出来的。因此可以使用Context中的方法,比如getResouces()等方法。
2)配置:
在配置文件中配置标签,设置android:name属性,也可以配置元素
3)启动:
Service启动依赖于其他组件,可以使用Activity或者Receiver等作为调用者,调用者可以使用以下两种形式启动Service
(1)startService(Intent service)
该方法用来启动一个独立的Service实例,该实例与调用者没有关联关系,调用者的生命周期不会影响到Service的生命周期
即使访问者退出了,Service仍然运行。
(2)bindService(Intent service, ServiceConnection conn, int flags)
该方法用来将一个Service实例与调用者建立关联关系,Service与调用者之间可以进行数据共享,调用者生命周期会影响的Service的生命周期,即访问者退出了,Service也就终止了,bindService方法有三个参数:
第一个参数包含要绑定Service信息的Intent对象
第二个参数是一个ServiceConnection对象,该对象用于监听访问者与Service之间的连接情况,当访问者与Service之间链接成功时将回调该对象的onServiceConnected(ComponentName name, IBinder service)方法,而当Service所在的宿主进程由于异常中止或由于其他原因终止,导致该Service与访问者之间断开连接时回调该ServiceConnection对象的onServiceDisconnected(ComponentName name)方法。其中调用者中的onServiceConnected方法中的IBinder对象,通过他可实现与被绑定的Service之间的通信。在开发Service类时,该Service类必须提供一个IBinder onBind()方法,该方法所返回的IBinder对象将会传给ServiceConnection对象里onServiceConnected方法的参数中。这样访问者就可以通过该IBinder对象与Service进行通信。实际开发时通常会采用继承Binder(IBinder的实现类)的方式实现自己的IBinder对象,再将其返回给启动者
第三个参数指定绑定时是否自动创建Service(如果Service还未创建),该参数可指定为0(不自动创建)或
BIND_AUTO_CREATE(自动创建)。
五、关于IntentService
Android中的Service是用于后台服务的,当应用程序被挂到后台的时候,为了保证应用某些组件仍然可以工作而引入了Service这个概念,那么这里面要强调的是Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的,也就是说,在更多时候不建议在Service中编写耗时的逻辑和操作,否则会引起ANR(Application Not Responding)。那么当我们编写耗时的逻辑,不得不被service来管理的时候,就需要在Service中启动一个新的子线程,在子线程完成耗时操作。就需要引入IntentService,而IntentService是继承Service的,它包含了Service的全部特性,当然也包含service的生命周期,那么与service不同的是,IntentService在执行onCreate操作的时候,内部又开了一个线程去执行你的耗时操作。该线程保证同一时刻只处理一个Intent.这样IntentService不会阻塞主线程。IntentService的使用和Service是类似的。它需要重写onHandleIntent(Intent intent)方法。注意:
在程序中,如果在activity中绑定了服务,而没有在destory中调用unbind()方法时就可能会出现was originally bound here错误。,
解决方式:在Activity的onDestory方法中调用手动unbindService(sc)方法,该方法是context中的方法。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories