Service

来源:互联网 发布:图片来源于网络 编辑:程序博客网 时间:2024/06/05 00:38
Service概述
1.Service是Android的四大组件之一
2.Service本质上是后台运行的可执行程序,他没有Activity那样的用户界面
3.Service通常不予用户交互,不能自己启动、运行在后台
4.Service主要应用于长时间的后台服务以及周期性的后台监控,如:
(1)播放多媒体的时候启动了其他Activity,此时程序要在后台继续播放
(2)检测SD卡上大文件的变化
(3)在后台记录手机当前的地理信息位置的改变
(4)在后台完成下载大文件等等
5.Service具有更高的进程优先级,在Android中进程有五个优先级别,Service位于第三个级别
6.Service具有全局唯一性。同一时间系统内只能存在一个Service实例
7.Service必须要在项目清单中注册才能使用,这一点与Activity相同
8.Android服务分为系统服务与应用服务
1)系统服务:Android提供了大量的系统Service,如:MediaService用于媒体录制、播放的系统服务
2)应用服务由开发者自己定义
二、启动、停止、绑定Service的相关方法
1.public ComponentName startService(Intent service)
作用:启动指定的Service
参数service:Intent对象,在该意图对象中指定启动的目标Service。启动方法有显式意图和隐式意图两种
说明:
1)startService()在ContextWrapper类中定义,该类的父类是Context
2)ContextWrapper类是Activity的间接父类和Service的直接父类
示例代码
Intent intent=new Intent(启动方组件的对象,目标Service.class)
startService(intent);
2.public boolean stopServices(Intent service)
作用:停止指定的service
说明:stopService方法是在ContextWrapper类中定义
3.public final stopSelf()
作用:在Service内部停止Service。
说明:stopSelf方法的执行不会会带哦Service中的onDestroy方法
4.bindService(Intent intent,ServiceConnection conn,int flags)
作用:与Intent指定的目标Service绑定
(1)参数intent:启动intent对象中指定的目标Service
(2)参数Conn:是一个实现了ServiceConnection接口的对象,该对象用于监听访问者与Service之间的绑定情况


。当绑定成功时,将调用ServiceConnection对象的onServiceConnected方法
(3参数flags:指定绑定时是否自动创建Service。值为0只不自动创建Service,当只是BIND_AUTO_CREATE常量(


值为1)时,自动创建Service。
5.ServiceConnection接口
作用:用于监听访问者与Service之间的连接情况,该接口定义了两个方法:
(1)onServiceConnected(ComponentName name,IBinder service)
作用:绑定成功时触发本方法
参数name:被绑定的Service的一个实例
参数Service:通过被绑定的Service类中的onBind方法返回一个IBind类型的对象。
(2)onServiceDisconnected(ComponentName name)
作用:绑定出现异常、应用程序出现崩溃时触发本方法
6.UnBindService(ServiceCoonnection conn)
作用:解除与Conn相关联的Service的绑定
参数Conn:是一个实现了ServiceConnection接口的对象
说明:unbindService执行后,系统会回调Service的onDestroy()方法。


Service的生命周期
startService()启动服务的执行流程
1.其他组件(例如Activity)调用startService();
2.服务被创建后,回调onCreate(),执行初始化操作
3.onStartCommand()方法被触发,服务处于运行状态
4.当执行stopService()后,将结束SErvice对象,同时onDestroy()方法被触发
提示:
如果Service还没有运行,则Android先调用onCreate()然后调用onStartCommand();
如果Service已经运行,则只调用onStartCommand(),所以一个Service的onStartCommand方法可能被重复滴啊用多


次,但onCreate方法只调用一次。
bindService()绑定的执行流程
onCreate()->onBind()->onUnbind->onDestroy()
1.若Service未启动,则创建Service,回调onCreate(),若Service已启动,则跳过本步骤。
2.onBind()被触发,并返回一个IBinder的实现类对象,该对象将在绑定的组件中被获得
3.onUnbind()在在unbindService()方法执行后触发
4.onDestroy()在Service被关闭是触发,在onDestroy方法中释放战友的系统资源,如结束Service中的线程,注销


各种监听器,注销广播接收者等。


再绑定的执行流程
Service在绑定后,可以解除绑定后,再次绑定。但前提是首次绑定时,该Service已存在,基:只有在单纯绑定的


情况下,解除绑定,才能再次绑定。若是绑定的同时启动Service,则解除绑定时,该Service将被关闭
执行流程:onBind()->onUnbind()->onRebind()


进程的优先级
(一)概述
Android规定,进程的优先级分为以下五个级别
1.Active Process
2.Visible Process
3.Started Service Process
4.BackGround Process
5.Empty Process


Active Process
前台进程是包含(与用户交互的)控件的那种应用程序。这些是Android通过回收资源来极力保护的进程,Active 


Process包括:
(1)处于active状态的Activity,他们运行在前台来处理用户的响应事件。
(2)Activity Service或者正在执行onReceive事件处理函数的Broadcast Receiver
(3)进程中包含正在与用户交互的activity绑定的service
(4)进程中包含执行了startForeground()的Service
(5)进程中包含了正在执行的onCreate,onStartCommand()或onDestroy方法的Service.


Visible Process
可见但不活动的进程是那些拥有"可见Activity"的进程。可见Activity是那些在屏幕上可见,比不是在前台或不响


应用户事件的Activity。这种情况发生在当一个Activity被部分遮盖的时候。可见进程只在极端的情况下,才会被


杀死保证Active Process的运行。包括以下情况:
(1)可见的Activity,但处于onPause()状态
(2)被可见Activity绑定的Service


Service Process
进程中包含已经启动的Service。Service以动态的方式持续运行但没有可见的界面。因为Service不直接和用户交


互,它们拥有比Visible Process较低的优先级。它们还是可以被认为是前台进程,不会被杀死


Background Process
进程中的Activity不可见和进程中没有启动任何的Service,这些进程都可以看作是后台进程。在系统中,拥有大


量的后台进程,在内存资源紧张时,Android按照后看见先杀掉的原则杀掉后台进程以获取资源给前台进程。


Empty Process
当一个进程被杀掉,进程保留,变成空进程
空进程中所有的组件都被关闭掉,但为了改善整个系统的性能,Android会在内存中保留那些已经走完生命周期的


应用程序。Android维护这些缓存来改善应用程序重新启动的时间。但这些进程在资源需要的时候常常被杀掉。


Service的应用场景
在开发Android应用项目中,若将耗时操作放在Activity的线程中(如播放音乐),将可能出现以下情况:
因接电话操作,使得应用程序成为后台进程(Activity被完全遮盖)或成为空进程(应用程序的所有Activity被关


闭)。虽然这是进程中的线程仍然在工作,如播放音乐,但空进程或后台进程在系统内存匮乏时,容易被系统彻底


杀掉,这样线程也将被停止。
为避免这种问题出现,将应用程序中的耗时操作放在Service中进行,由于Service的进程优先级为第三季,要高于


第四级、第五级的后台进程和空进程,将大大降低耗时操作被系统杀掉的几率。


Service的绑定原理
(一)概述
1.一个Activity与一个Service只能绑定一次
2.一个Activity可以同时绑定到多个Service
3.一个Service亦可以同时被多个Activity绑定
4.当绑定到一个Service,且将flag设置为BIND_AUTO_CREATE时,如果该Service为创建,则先创


建Service(onCreate),然后再绑定,如果Service已经被创建,则直接绑定
5.如果Service被多个Activity绑定,只有当所有的客户端都解除绑定时才能被destroy
6.Binder类用于客户端与服务端的通信,Binder的意思是别针,可以理解为用Binder将服务端与客户端"别"在一起



(二)绑定组件时数据传值分析
以下代码展示绑定的Service的类结构
public class TargetService extends Service{
private int mCount;
private int inc(){
mCount++;
return mCount;
}
public class InfoBind extends BInder{
public int count(){
return inc();
}
}
public IBinder onBind(Intent arg0){
InfoBind bind=new InfoBind();
return bind;
}
}
说明:
以上代码中的InfoBind是TargetService的一个内部类,该类只是示范,类名不一定非是InfoBind,该类是Binder


类的子类。而Binder类实现了IBinder接口。因此在onBind方法中可以返回InfoBind对象。
当然,可以在onBind方法的return命令后面直接写new IBinder(),机返回接口的一个实现类的对象,但要实现


接口所有声明的方法。
Android框架提供了Binder类,该类实现了IBInder接口中的方法,由于这些方法是被系统调用,应用开发时无需调


用。因此,以上的InfoBinder类通过继承Binder,间接实现了IBinder接口,则onBInd方法允许返回InfoBind对象
实际开发中通常采用以上方式返回一个对象。该对象中可以自定义与业务需求相关的方法,这些方法可以返回当前


Service的一些数据。
onBind()方法返回的对新爱国将在onServiceConnected()方法的第二个参数service获得,基service中存放了


onBind()放回的对象的地址。
(三)bindService与startService对比
1.通过多次调用startService,每次都触发Service类中的onStartCommand(),并用Intent对象向Service传递不同


的数据,从而达到控制Service。但这种方式不太方便。
2.通过绑定的方式,使用onBind传给ServiceConnection的IBinder控制Service。这种方式比较便捷,实际开发中


推荐使用这种方式。
(四)关于onServiceDisconnected方法的调用
1.当ACtivity与Service绑定时,若出现进程崩溃,则onServiceDisconnected方法将被触发
2.当进程被终止时,将触发onServiceDisconnected方法
3.onServiceDisconnected方法有Android系统调用,不要程序触发,不要在此方法中编写业务逻辑代码。


隐式意图启动Service
1.使用隐式意图可以启动另外一个应用程序的服务,从而实现跨进程启动服务
2.在项目的清单文件中注册Service时,通过添加Intent-filter,允许设备中其他应用程序通过隐式意图来启动本


程序中的Service
提示:
若不想让其他应用程序启动本应用的Service,则不要在Service标签中声明Intent-filter。

























1 0
原创粉丝点击