2018-05-12—Service使用

大家好,又和大家见面了哈哈,上一次我们说的广播接收者大家还有印象吗,我们把他变相的理解成了广播的接收,有动态注册和静态注册两种方法,通过sendBroadcast方法发送广播,具体的大家可以看一下上一篇博客就好。

另外,笔者已经在CSDN开始写新的文章了,虽然刚刚起步,还是希望大家多多支持哈,地址如下:季白的CSDN博客

好了现在进入我们今天的正文。


我们现在已经学过了Activity和BroadcastReceiver这两个组件,今天我们来学习在Android一个同样很重要的组件——服务Service。

我们来看一下官方文档是怎么描述的:

A Service is an application component representing either an application's desire

to perform a longer-running operation while not interacting with the user

or to supply functionality for other applications to use.  Each service

class must have a corresponding

{@link android.R.styleable#AndroidManifestService } * declaration in its package'sAndroidManifest.xml. Services * can be started with * {@link android.content.Context#startService Context.startService()} and * {@link android.content.Context#bindService Context.bindService()}.

他是一个应用组件,代表一种建立一个长时间的操作而又不与用户进行交互、或者为其他应用提供功能,每一个服务都必须跟Manifest中标签相对应(就是必须在Manifest中注册),有两种启动方式,可以被startService方法启动,也可以被bindService方法启动。

Note that services, like other application objects, run in the main

thread of their hosting process.  This means that, if your service is going

to do any CPU intensive (such as MP3 playback) or blocking (such as

networking) operations, it should spawn its own thread in which to do that

work.

服务跟其他对象一样,是在主线程中运行的,这就是说如果你想要在服务中进行一个耗时操作(MP3播放,网络请求)你就需要创建一个子线程。

这个文档还有很多很多,你们自己慢慢看吧(最后感谢Android Studio的有道翻译插件让我成功装B   -。+)。

通过这段文档我们知道了,这个组件的用途,是用来处理一些长时间的操作,而这些操作又不需要和用户UI进行交互。

上面也提到了Service有两种启动方式:startService和bindService,我们先来看第一种方式:



一、startService方式启动

我们先看一下这个方法的参数:

startService

只是传入一个意图进去。

在启动之前,我们首先要有一个我们自己的Service。

创建Service对象

我们重写了onBind方法。这个方法我们现在先不说,等一会儿再用。

和Activity一样,Service也是有自己的生命周期的,所以我们把对应的生命周期方法全部重写,然后打上Log。

重写三个生命周期方法

记得在Manifest中生命MyService。

现在我们在MainActivity中启动Service。

没错,启动就是一句话的事情,但是别忘了在活动销毁的时候停止服务。

我们现在点开App,看一下日志。

日志

我们看到服务调用了onCreate方法和onStartCommand方法,现在我们点击back键退出app

日志

它调用onDestroy方法了。

没错,如果我们用这种方式启动服务的话,那么他就是这个流程:

第一种方式创建

如果我们重复的调用startService方法,不会多次创建Service对象,如果已经创建过,他会直接调用onStartCommand方法。

但是大家有没有注意到:如果我们用这种方式启动了Service,我们只是让他启动了,但是他具体在干什么,在什么时候干了什么事情,我们是一点也不知道的,我们只是给他开门和关门。

如果我们需要不定期的从服务中获取一些数据(我们需要和服务进行交互时候),我们就不能通过这种方式启动服务了,但我们还有另一种方式,bindService。


二、bindService方法

为了看的清晰,我重新创建一个MyService2吧。

Myservice2

这次我们重写了onCreate、onUnbind、onDestroy方法。然后分别打上日志。

创建MyBinder

然后我们创建了一个叫做MyBinder的类继承Binder。我们发现onBind方法中返回一个IBinder对象,这个Binder就是继承IBinder这个类的。

我们刚才说第一种方法没有办法让服务和Activity进行交互,但是这种方式可以,这种方式其实就是通过Binder这个类来实现的,我们可以在MyBinder中添加自己的方法,来得到MyService中的一些属性值。举个例子:


我们创建了一个getProgress的方法。用来返回在操作过成中不断变化的pro变量的值。

到现在MyService2创建完成了,我们看看Activity中怎么启动。

我们创建了一个叫做ServiceConncetion的对象,里面实现了两个方法:

onServiceConnected方法,是在我们绑定了服务之后,调用的方法,而onServiceDisconnected方法是在我们服务异常断开连接时候,调用的(切记不是解除绑定时候调用的!!!)。


我们绑定方法的参数有三个,第一个是意图,不多说,第二个是我们刚才创建的ServiceConnection对象,第三个是一个int类型,这个BIND_AUTP_CREATE代表绑定时候自动创建Service。

然后我们在onDestroy中解除绑定。

如果现在我们想获取服务中的进度,我们就可以通过我们刚刚在onServiceConnected中获取的Binder对象,来得到值了。


通过一个按钮来获取pro的值。

我们来看一下效果:



最后在我们退出app时候,他会依次执行unUnbind方法和onDestroy方法。


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容