Android Studio使用onCreate(),onStartCommand()和stopService()方法来启动和停止服务

Service的基础知识:

        Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件。服务可由其他应用组件启动(如Activity),服务一旦被启动将在后台一直运行,即使启动服务的组件(Activity)已销毁也不受影响,所以通也被称为“后台服务”。
一般应用场景:
    具有较长运行特性的场景(后台下载、音乐播放)
    部分不依赖UI界面的场景(通信)

          接下来我们开始尝试下使用onCreate(),onStartCommand()和stopService()方法来启动和停止服务,以下是详细步骤:

我们先新建一个叫做ServiceTest项目,然后new一个Service:

 接着出现以下界面:

 其中,Exported属性,表示是否允许除了当前程序以外的其他程序访问这个服务。

Enabled属性,表示是否启用这个服务。

我们这里现先将两个属性都勾选,点击finish完成创建。

既然定义了一个服务,自然应该在服务中去处理一些事情了。接着,我们可以重写Service的一些方法:

这三个方法是服务中最常用到的3个方法。

onCreate():会在服务创建时被调用。

onStartCommand():会在每次服务启动时被调用。

onDestroy():方法会在服务被销毁的时候调用。

通常情况下,如果我们希望服务一旦启动就立刻去执行某个动作,那我们就可以将逻辑写在onStartCommand()方法里;当服务需要被销毁时,我们应该在onDestroy()方法中去回收那些不再被使用的资源。

另外需要注意,每一个服务都需要在AndroidManifest.xml文件中进行注册才能生效。

怎么注册呢,就是在AndroidManifest.xml文件中添加以下黄色区域的代码。不过,AndroidStudio会自动帮我们注册好的。

OK,目前为止,我们已经将一个服务完全定义好了。

定义好了服务之后,接下来就该考虑如何去启动以及停止这个服务。主要是借助Intent来启动或停止,接下来我们去尝试一下启动或停止MyService这个服务。

首先先修改activity_main.xml中的代码:(采用线性布局,定义两个Button)

接着修改MainActivity中的代码: 

         首先修改onCreate()方法,获取StartService按钮和Stop Service按钮的实例,并给它们注册了点击事件。

   然后修改onClick()方法:

 以上代码,我们调用了来自Context类中的startService()和stopService()方法,分别来启动和停止MyService这个服务。

这时你想:如果你不想点击stop按钮,又想让服务停止,该怎么办?很简单,这要在MyService任何一个地方调用stopSelf()方法就能让这个服务停止下来。

OK,现在已经实现了启动和停止服务。那么该如何去验证服务是否真的实现了启动和停止?

最简单的方法就是在MyService的几个方法中加入打印日志

我们来运行一下代码,点击下StartService按钮,观察logcat中的打印日志:

观察到这张图上所述内容,说明 onCreate()和onStartCommand()方法都执行了,说明这个服务确实已经启动成功了!

这时再点一下Stop Service按钮:

 出现上图信息可以证明,MyService成功停止下来了。

这时候,细心的你可能会发现,点击Start Service按钮后,onCreate()方法和onStartCommand()方法都被调用和执行了。那么,它们到底有什么区别呢?

其实,onCreate()方法是在服务第一次创建的时候调用的,而onStartCommand()方法则在每次启动服务的时候都会被调用。由于我们刚才是第一次点击StartService按钮,服务此时还没被创建过,所以两个方法都会被执行,之后如果你再连续多点击几次StartService按钮,你会发现只有onStartCommand()方法被执行。

现在我们来总结下以上文章提及的启动停止服务的方式:

    使用了startService(Intent intent)方法启动服务
在Intent对象中指定需要启动的服务。
    使用了stopService(Intent intent)方法停止服务
这种启动方式的特点:
1、一旦服务开启跟调用者(开启者)就没有任何关系了。
2、开启者退出了,开启者挂了,服务还在后台长期的运行。
3、开启者不能调用服务里面的方法。
 

看到第3点,你可能会发现,当我们用startService()启动服务MyService后,服务会一直处于运行状态,直到被我们停止。但是,服务处于运行状态时到底干了啥,我们不得而知。(⊙o⊙)。

那么有什么方法,能让活动(Activity)和服务(Service)的关系更紧密一些呢?比如说,在活动中我想让服务执行过程中干什么,服务就去干什么。这时,我们可以使用bindService()和unbindService()方法启动和关闭MyService,这里不再详细描述。

注:本文参考了《第一行代码 第2版》部分内容

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>