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方法。