文档章节

Service(服务)

 梦想家Peng
发布于 2016/03/01 15:40
字数 1259
阅读 8
收藏 0
点赞 1
评论 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
博文 33
码字总数 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 ⋅ 0

Android之getSystemService

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

billy_lin ⋅ 2012/09/21 ⋅ 0

Service的简单介绍

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

初来小修 ⋅ 2016/02/19 ⋅ 0

CentOS 7.x设置自定义开机启动,添加自定义系统服务

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

技术小胖子 ⋅ 2017/11/09 ⋅ 0

OpenStack的结构

1.OpenStack的核心服务 Nova计算服务(Computer as a Service) Neutron网络服务(Networking as a Service) Swift对象存储服务(Object Storage as a Service) Cinder块存储服务(Block Sto......

clvn ⋅ 2015/03/15 ⋅ 0

后台服务程序开发模式

转载自:http://blog.csdn.net/ashao1981/article/details/22359 一直感觉VC++太复杂了,但昨天看了汪蒲阳编著的因特网应用编程,其中写到后台服务程序的编写,论述的非常详细,而且逻辑清晰...

科技探索者 ⋅ 2017/11/07 ⋅ 0

Android之service

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

晨曦之光 ⋅ 2012/05/16 ⋅ 0

dubbo顺序调用服务,其中一个出错。怎么保证整个方法正常执行。

dubbo 在顺序调用 远程服务的时候 必须要循环调用5个服务。 其中一个服务挂掉了。那么就会抛出异常 ,导致整个方法不可用。 但是想要 忽略其中挂掉的服务,不要求每一个都成功但是大体上要成...

StopTWorld ⋅ 2017/12/15 ⋅ 5

服务管理--systemctl命令

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

wulei163 ⋅ 2014/01/08 ⋅ 1

OpenStack的概念与架构图

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

兄之老久 ⋅ 2017/05/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mysql5.7系列修改root默认密码

操作系统为centos7 64 1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2、重启 mysqld 服务:systemctl restart mysql...

sskill ⋅ 昨天 ⋅ 0

Intellij IDEA神器常用技巧六-Debug详解

在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动服务器,然后,就可以在代码里面断点调试啦。下面不要在意,这个快捷键具体是啥,因为,这个keymap是可以自己配置的...

Mkeeper ⋅ 昨天 ⋅ 0

zip压缩工具、tar打包、打包并压缩

zip 支持压缩目录 1.在/tmp/目录下创建目录(study_zip)及文件 root@yolks1 study_zip]# !treetree 11└── 2 └── 3 └── test_zip.txt2 directories, 1 file 2.yum...

蛋黄Yolks ⋅ 昨天 ⋅ 0

聊聊HystrixThreadPool

序 本文主要研究一下HystrixThreadPool HystrixThreadPool hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java /** * ThreadPool used to executed {@link Hys......

go4it ⋅ 昨天 ⋅ 0

容器之上传镜像到Docker hub

Docker hub在国内可以访问,首先要创建一个账号,这个后面会用到,我是用126邮箱注册的。 1. docker login List-1 Username不能使用你注册的邮箱,要用使用注册时用的username;要输入密码 ...

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

SpringBoot简单使用ehcache

1,SpringBoot版本 2.0.3.RELEASE ①,pom.xml <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELE......

暗中观察 ⋅ 昨天 ⋅ 0

监控各项服务

比如有三个服务, 为了减少故障时间,增加监控任务,使用linux的 crontab 实现. 步骤: 1,每个服务写一个ping接口 监控如下内容: 1,HouseServer 是否正常运行,所以需要增加一个ping的接口 ; http...

黄威 ⋅ 昨天 ⋅ 0

Spring源码解析(八)——实例创建(下)

前言 来到实例创建的最后一节,前面已经将一个实例通过不同方式(工厂方法、构造器注入、默认构造器)给创建出来了,下面我们要对创建出来的实例进行一些“加工”处理。 源码解读 回顾下之前...

MarvelCode ⋅ 昨天 ⋅ 0

nodejs __proto__跟prototype

前言 nodejs中完全没有class的这个概念,这点跟PHP,JAVA等面向对象的语言很不一样,没有class跟object的区分,那么nodejs是怎么样实现继承的呢? 对象 对象是由属性跟方法组成的一个东西,就...

Ai5tbb ⋅ 昨天 ⋅ 0

Ubuntu16.04 PHP7.0 不能用MYSQLi方式连接MySQL5.7数据库

Q: Ubuntu16.04 PHP7.0 不能用MYSQLi方式连接MySQL5.7数据库 A: 执行以下2条命令解决: apt-get install php-mysql service apache2 restart php -m 执行后会多以下4个模块: mysqli mysqlnd...

SamXIAO ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部