文档章节

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
深圳
服务管理--systemctl命令

任务 旧指令 新指令 使某服务自动启动 chkconfig --level 3 httpd on systemctl enable httpd.service 使某服务不自动启动 chkconfig --level 3 httpd off systemctl disable httpd.service ......

alex43211
2016/01/04
83
0
Service的简单介绍

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

初来小修
2016/02/19
162
0
Android之getSystemService

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

billy_lin
2012/09/21
0
0
CentOS 7.x设置自定义开机启动,添加自定义系统服务

Centos 系统服务脚本目录: /usr/lib/systemd/ 有系统(system)和用户(user)之分, 如需要开机没有登陆情况下就能运行的程序,存在系统服务(system)里,即: /lib/systemd/system/ 反之...

技术小胖子
2017/11/09
0
0
Android之service

Service是Android四大组件中与Activity最相似的组件,他们都代表可执行的程序,Service与Activity的区别在于:Service一直在后台运行,他没有用户界面,所有绝对不会到前台来,一旦servcie被...

晨曦之光
2012/05/16
303
0

没有更多内容

加载失败,请刷新页面

加载更多

ajax 提交返回map集合 获取不到值

后台java代码 @RequestMapping("/cameraList") @ResponseBody public Map<String, Object> cameraListForPage(@RequestParam(defaultValue = "1", value = "page") Integer page......

S三少S
5分钟前
0
0
TypeScrip最污的技术课-技术胖TypeScript图文视频教程

近日Node.js之父瑞安达尔(Ryan Dahl)发布新的开源项目 deno,从官方介绍来看,可以认为它是下一代 Node,使用 rust 语言代替 C++ 重新编写跨平台底层内核驱动,上层仍然使用 V8 引擎,最终...

JamesView
7分钟前
5
0
Es学习笔记

1.过滤排重聚合查询 筛选出某一个聚合值的个数统计。相当于mysql的distinct. 关键字:cardinality "aggs": { "2":{ "cardinality": { "field": "field" } ...

Gmupload
10分钟前
0
0
h5语义化标签

语义化HTML:用最恰当的HTML元素标签做恰当的事情。 优点: 提升可访问性; SEO; 结构清晰,利于维护; 通用容器:div——块级通用容器;span——短语内容无语义容器。 <title></title>:简...

莫西摩西
16分钟前
0
0
修改11g rac中 asm diskstring的发现路径

问题 : 如果我 们asm_disking以前是/dev/oracleasm/disks/* ,并且现在已经有磁盘组再用这个磁盘串了,那么,我们无法直接修改这个发现串为 ORCL:*,修改会报错,提示存在的磁盘无法使用新的...

tututu_jiang
19分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部