文档章节

Service(服务)

 梦想家Peng
发布于 2016/03/01 15:40
字数 1259
阅读 10
收藏 0

Service(服务)

---------------------------------

Service是Android系统的核心组件,由Android创建、维护和管理。

Service需要在AndroidManifest.xml文件中注册。

开发者所开发的所有Service都需要继承自android.app.Service类。

Service是没有界面的,适用于在后台(表示看不见)执行耗时任务。

尽管Service适合用于执行耗时任务,但是,Service仍然是运行在主线程的,所以,当执行任务时,应该开启子线程来完成。

Service是单例的。

开发Service的步骤

---------------------------------

1. 自定义类继承android.app.Service,由于Service是抽象的,所以,实现继承关系后,自定义的类需要重写抽象方法onBind(),目前,无视该方法,仅保证该方法存在即可

2. 打开AndroidManifest.xml文件,在<application>节点之下,添加<service>节点(与<activity>节点同级,且不区分先后顺序),并且至少配置<service>节点的android:name属性,该属性的值为自定义的Service类的完整名称,即包名+类名,例如cn.tedu.app.SampleService

启动Service

---------------------------------

在任何ContextWrapper的子类(例如Activity)中,调用startService(Intent intent)方法,即可激活Service组件


关闭Service

---------------------------------

方法1:在任何ContextWrapper的子类中,调用stopService(Intent intent)方法,即可关闭/停止Service

方法2:在Service内部,调用stopSelf()方法关闭自身


Service的生命周期

---------------------------------

onCreate():当Service组件被创建(第1次激活)时调用,反复激活同一个Service组件并不会重复调用该方法

onStartCommand():当Service组件被激活时调用,每次激活都会调用该方法,在第1次激活时,该方法将在onCreate()之后执行

onDestroy():当Service组件被销毁时调用


Service的粘性

---------------------------------

Service的粘性表现为:当Service被意外销毁时,会自动重新启动Service

Service的粘性是通过onStartCommand()方法的返回值确定的,该返回值的取值可以有:

a) START_STICKY:粘性的

b) START_NOT_STICKY:非粘性的

c) START_STICKY_COMPATIBILITY:兼容模式下的粘性的

d) START_REDELIVER_INTENT:粘性的,且在自动重新启动Service时会携带原来激活Service的Intent对象


绑定模式的Service

----------------------------

通过startService()激活的Service,称之为“启动模式”的Service

绑定模式的Service可以实现让其它组件(例如Activity)绑定到Service上,并且可以调用Service的方法,从而实现组件间的通信

开发步骤:

1) 创建Service,并注册

2) 重写Service中的onBind()方法,并确保该方法的返回值不为null,该返回值的类型是IBinder,推荐自定义类继承Binder来实现

3) 在其它组件(例如Activity)中,调用bindService()方法绑定到Service,该方法需要3个参数,第1个参数Intent用于配置需要被绑定的Service组件,第2个参数ServiceConnection是接口,需要自定义实现类并创建对象,第3个参数表示标识,使用常量BIND_AUTO_CREATE

4) 在Activity的onDestroy()方法中,调用unbindService()方法取消绑定,该方法的参数即为此前bindService()时的第2个参数

绑定模式的Service的生命周期

----------------------------

1. onCraete()

2. onBind()

3. onUnbind()

4. onDestroy()


绑定的Service

【作用】

绑定的Service用于实现进程间通信的。

【组件间通信开发流程】

1. 自定义Service,注册

2. 自定义接口,用于约定Activity需要调用Service来执行的方法

3.1 [Service] 自定义内部类,继承Binder,并实现上述接口

3.2 [Service] 重写onBind(),将内部类的对象作为返回值

4.1 [Activity] 自定义内部类,实现ServiceConnection

4.2 [Activity] 在需要绑定Service时,调用bindService()方法实现绑定

4.3 [Activity] 在内部类的onServiceConnected()方法中,将参数IBinder service强制转换为第2条步骤的接口类型,则可以调用Service中的方法

4.4 [Activity] 在onDestroy()方法中,调用unbind()方法解除与Service的绑定,该语句应该在super.onDestroy()之前调用


Intent intent = new Intent(this, LocalService.class);
bindService
(intent, mConnection, Context.BIND_AUTO_CREATE);

【进程间通信的开发流程】

1. 在“服务端”,参考“组件间通信”,创建Service及必要的Service的处理

2. 在“客户端”准备访问“服务端”的Activity及界面的初始化等

3. 为“服务端”的Service配置intent-filter,使得该Service可以被其它应用程序激活

4. 将“服务端”原有的IMusicPlayer.java接口修改为AIDL接口

5. 将“服务端”的Service中的内部类(InnerBinder)修改为直接继承自IMusicPlayer.Stub

6. 在“客户端”创建“服务端”的AIDL文件的包名,并把“服务端”的aidl文件复制到“客户端”

7. 在“客户端”,在InnerServiceConnection的onServiceConnected()方法中,通过IMusicPlayer.Stub.asInterface()方法获取IMusicPlayer的对象


© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 34
码字总数 15605
作品 0
深圳
私信 提问
Android之getSystemService

getSystemService是Android很重要的一个API,它是Activity的一个方法,根据传入的NAME来取得对应的Object,然后转换成相应的服务对象。以下介绍系统相应的服务。 传入的Name 返回的对象 说明...

billy_lin
2012/09/21
0
0
Service的简单介绍

1、为什么不使用后台线程而使用Service? 1)、Service可以放在独立的进程中,所以更安全; 2)、使用Service可以依赖现有的binder机制,不需要在应用层面上处理线程同步的繁杂工作; 3)、系统...

初来小修
2016/02/19
162
0
OpenStack的概念与架构图

OpenStack项目是一个开源的云计算平台,旨在实现很简单,大规模可伸缩,功能丰富。来自世界各地云计算开发人员和技术人员共同创建OpenStack项目。OpenStack通过一组相关的服务提供一个基础设施...

兄之老久
2017/05/18
0
0
SERVICE_STATUS结构各成员解析

在编写Windows服务的时候,需要调用API函数::SetServiceStatus()向服务控制管理器(SCM)提交更新当前服务的状态信息,其第2个参数为指向SERVICESTATUS结构的指针,SERVICESTATUS结构中包含了...

geek_loser
2016/03/04
18
0
OpenStack的基本概念与架构图

OpenStack项目是一个开源的云计算平台,旨在实现很简单,大规模可伸缩,功能丰富。来自世界各地云计算开发人员和技术人员共同创建 OpenStack项目。OpenStack通过一组相关的服务提供一个基础设施...

bengozhong
2016/10/24
72
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据学习有哪几个步骤

目前大数据行业异常火爆,不少人都对大数据充满了兴趣,其中有大部分人都从没接触过大数据,对于应该如何学习大数据一头雾水。大数据学习并不是高深莫测的,虽然它并没有多简单,但是通过努力...

董黎明
16分钟前
4
0
shell习题_3

1:监控httpd的进程;每隔10s检测一次服务器的httpd的进程数,如果大于500则自动重启httpd服务;并检测是否启动成功; 如果没有正常启动还需要再启动一次,最大不成功数超过五次立即发邮件给管理...

芬野de博客
17分钟前
1
0
Android 9.0 优势探讨

我们来谈论一下 Android。尽管 Android 只是一款内核经过修改的 Linux,但经过多年的发展,Android 开发者们(或许包括正在阅读这篇文章的你)已经为这个平台的演变做出了很多值得称道的贡献...

问题终结者
33分钟前
4
0
vue 组件使用中的一些细节点

细节一 基础例子 运行结果: 以上大家都懂,这边就不多说,回到代码里,有时候我们需要 tbody 里面每一行是一个子组件,那我们代码可以怎么写呢?我们可以这样写,定义一个全局组件,如下: ...

peakedness丶
40分钟前
2
0
vue 之 css module的使用方法

动手之前先配置项目,网上很多文章说需要下载css-loader插件,Vue中的vue-loader已经集成了 CSS Modules,因此删掉也能正常运行 在vue.config.js中添加如下配置 `css: {``loaderOptions: ...

前端小攻略
44分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部