1.1 活动和服务进行通信

上一节中我们学习了启动和停止服务的方法。不知道你又没有发现,虽然服务是在活动里启动的,但在启动了服务之后,活动和服务基本上就没关系了,确实如此,我们在活动里调用了startService()方法来启动myService这个服务,然后MyService的onCreate()和onStartCommand()方法就会得到执行。之后服务一直处于运行状态,但具体运行的是什么逻辑,活动就控制不了了。这就类似于活动通知了服务一下:'你可以启动了!' 然后服务就去忙自己的事情了,但活动并不知道服务到底去做了什么事情,以及完成的如何。

那么有没有什么办法能让活动和服务的关系更亲密一些呢?例如在活动中指挥服务去干什么,服务就去干什么。当然可以,这就需要借助我们 刚刚忽略的onBind()方法了。

比如目前我们希望在ServiceTest里提供一个下载功能,然后在活动中可以决定何时开始下载,以及随时查看下载进度。实现这个功能的思路是创建一个专门的Binder对象来对下载进行管理,修改ServiceTest中代码如下:

public class ServiceTest extends Service{

private DownloadBinder mBinder=new DownloadBinder();

class DownloadBinder extends Binder{

public void startDownload(){

Log.d("MyService","startDownload executed");

public int getProgress(){

Log.d("MyService","getProgress executed");

return 0;

}

}

@Override

public IBinder onBind(Intent intent){

return mBinder;

}

}

可以看到,我们这里新建了一个DownloadBinder类,并让它继承自Binder,然后在它的内部提供了下载以及查看下载进度的方法。当然这只是两个模拟方法,并没有实现真正的功能。接着,在ServiceTest中创建了DownloadBinder的实例,然后在onBind()方法里返回了这个实例,这样ServiceTest中的工作就算全部完成。

1.2服务的生命周期

前面我们使用到的onCreate()、onStartCommand()、onBind()和onDestroy()等方法都是在服务的生命周期中回调的方法。一旦在项目的任何位置调用了Context的startService()方法,相应的服务就会启动起来,并回调onStartCommand()方法。如果这个服务之前还没有创建过。onCreate()方法会先于onStartCommand()方法执行。服务启动了会一直保持运行状态,onStartCommand就会执行一次,但实际上每个服务都只会存在一个实例。所以不管你调用了多少次startService()方法,只需调用一次stopService或stopSelf()方法,服务就会停止下来。

另外,还可以调用Context的bindService()来获取一个服务的持久连接,这时就会回调服务中的onBind()方法。类似的,如果这个服务之前还没有创建过,onCreate()方法会先于onBind()方法执行。之后,调用方可以获取到onBind()方法里返回的IBinder对象的实例,这样就能自由的和服务进行通信了。只要调用方和服务之间的连接没有断开,服务就会一直保持运行状态。当调用了startService方法之后。又去调用stopService()方法,这时服务中的onDestroy()方法就会执行,表示服务已经被销毁。类似地,当调用了bindService()方法后,又去调用了unbindService()方法,onDestroy()方法也会执行,这两种情况都很好理解。但是需要注意,我们是完全有可能对一个服务既调用了startService()方法,又调用了bindService方法的,这种情况下该如何才能让服务销毁掉呢?根据android系统的机制,一个服务只要被启动或者被绑定了之后,就会一直处于运行状态,必须要让以上两种条件同时不满足,服务才能被销毁。所以,这种情况下要同时调用stopService()和unbindService()方法onDestroy()方法才会执行。

android Service服务(二)的更多相关文章

  1. Android Service 服务(三)—— bindService与remoteService

    (转自:http://blog.csdn.net/ithomer/article/details/7366396)   一.bindService简介 bindService是绑定Service服务, ...

  2. Android Service 服务(二)—— BroadcastReceiver

    (转自:http://blog.csdn.net/ithomer/article/details/7365147) 一. BroadcastReceiver简介 BroadcastReceiver,用 ...

  3. Android Service 服务

    一. Service简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟Activi ...

  4. Android Service 服务(一)—— Service .

    http://blog.csdn.net/ithomer/article/details/7364024 一. Service简介 Service是android 系统中的四大组件之一(Activit ...

  5. [Android] Service服务详解以及如何使service服务不被杀死

    排版上的细节有些不好看,主要是我用的MarkDown编辑器预览和这里的不一样,在那个上面的样式很舒服.这里要改的地方太多就不想改了,将就看吧.下次写的时候注意.还有看到错误给我提啊. 本文链接:htt ...

  6. android service服务的学习

    1.Service简单概述   Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件.服务可由其他应用组件启动(如Activity),服务一旦被启动将在后台一直运行,即 ...

  7. Android Service服务

    Service是Android系统中提供的四大组件之一.它是运行在后台的一种服务,一般声明周期较长,不直接与用户进行交互.    服务不能自己运行,需要通过调用Context.startService ...

  8. 【转】android service 之二(IntentService)

    原文网址:http://rainbow702.iteye.com/blog/1143286 不管是何种Service,它默认都是在应用程序的主线程(亦即UI线程)中运行的.所以,如果你的Service ...

  9. Android service 服务的应用之电话监听器以及短信监听器

    首先建立一个项目工程文件,如下图所示:

随机推荐

  1. JavaScript(Two)

    innerHtml xx.innerHtml 读取元素内的所有Html内容 xx.innerHtml = 新的值 替换元素内的所有Html内容 JS中不予许出现"-"; font- ...

  2. setTimeout的实现原理以及setTimeout(0)的使用场景

      先看一段代码: var start = new Date(); setTimeout(function(){ var end = new Date(); console.log("Tim ...

  3. 18_Condition条件

    [简述] wait()和notify()方法是和synchronized关键字合作使用的. Condition是和重入锁相关联的,通过ReentrantLock.newCondition()生成一个与 ...

  4. 【Linux】Windows与Linux之间的文件共享(基于网络)

    切记:Linux的安全机制的存在--iptables和selinux. 一.操作前提 1.1 从Windows能够ping通Linux 1.2 关闭Linux防火墙 command1:/etc/ini ...

  5. JavaScript的数据类型与变量

    JavaScript数据类型 1.原始数据类型: 数值型,如十进制数.十六进制数.八进制数和特殊值(Infinity.NaN),注意:NaN不能和自身比较 字符串型,如定界符.转义符: 布尔类型. 2 ...

  6. memcached与spring集成

    一.背景 销售CRM(项目A)将负责管理项目信息系统(项目B)的支付与权限 上级要求为避免频繁调用CRM接口,中间放一级缓存,但要做到缓存中保证最新数据 因项目B已使用memcache作缓存,所以决定 ...

  7. 开发者为何对Service Fabric爱不释手?值得关注!

    有了它,人人都可开发高可用高伸缩应用.今天小编就为大家介绍一款开发者的“利器”——Service Fabric . 在介绍它之前,先来了解一下它的背景. Service Fabric 是一款应用程序平 ...

  8. koa2获取用户ip

    调用下面方法即可获取 // koa2 中 req 为 ctx.req const getUserIp = (req) => { return req.headers['x-forwarded-f ...

  9. ICONIX Process

    1.像rup,iconix是用例驱动的但是比rup更轻量级.  iconix 仅仅使用四种diagram(用例图.健壮性图.时序图.类图)就可以把用例文本转成代码. 2.值得注意的健壮性分析图并不是u ...

  10. June 08th 2017 Week 23rd Thursday

    Life is like a beautiful melody, only the lyrics are messed up. 生命是首美丽的曲子,虽然歌词有些纠结. Now that we get ...