android服务范围界面,Android四大基本组件——Service

Service(服务)是一个可以在后台执行长时间运行操作而不使用用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行。

1.  创建Service

31b70c18ea06

直接定义一个类,继承自Service,和activity一样,也要在AndroidManifest.xml中配置该Service。示例代码如下:

AndroidManifest.xml中配置如下:

31b70c18ea06

2.  Service的两种开启方式

1. startService()启动服务

开启服务后,服务就会长期的后台运行,即使调用者退出了,服务仍然在后台继续运行,服务和调用者没有什么关系,调用者是不可以访问服务里面的方法。

2. bindService()绑定服务

服务开启后,生命周期与调用者相关联,调用者挂了,服务也会跟着挂掉,调用者和服务绑定在一起,调用者可以间接的调用到服务里面的方法。

3. Service的生命周期

如下图,是官方提供的两种开启方式的生命周期的示意图:、

31b70c18ea06

1. startService()启动服务

下图为Service需要重写的回调方法:

31b70c18ea06

可以将Service看成一个没有前台界面的Activity。

31b70c18ea06

当我们第一次启动服务时执行onCreate()、onStartCommand方法,当我们再次启动服务的时候,是没有执行onCreate()方法的,只有当Service没有创建的时候才会回调这个方法,一旦Service被创建后再次startService启动Service也不会再次回调这个方法。当MainActivity销毁时,我们发现MyService中并没有执行onDestroy(),只有当我们再次启动MainActivity,点击了停止服务后,MyService服务才被销毁了,即使调用者退出了,服务仍然在后台继续运行。

onBind()方法:

当另一个组件想通过调用 bindService() 与服务绑定时,系统将调用此方法。在此方法的实现中,必须返回一个IBinder 接口的实现类,供客户端用来与服务进行通信。无论是启动状态还是绑定状态,此方法必须重写,但在启动状态的情况下直接返回 null。

onCreate()方法:

首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用onStartCommand() 或onBind() 之前)。如果服务已在运行,则不会调用此方法,该方法只调用一次。

onStartCommand(Intent intent, int flags,int startId)

当另一个组件(如 Activity)通过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。 如果自己实现此方法,则需要在服务工作完成后,通过调用 stopSelf() 或 stopService() 来停止服务。(在绑定状态下,无需实现此方法。)

onStartCommand三个参数:

intent:启动时,启动组件传递过来的Intent,如Activity可利用Intent封装所需要的参数并传递给Service

flags:表示启动请求时是否有额外数据

可选值有0,START_FLAG_REDELIVERY,START_FLAG_RETRY。

0 代表没有;

START_FLAG_REDELIVERY 这个值代表了onStartCommand方法的返回值为

START_REDELIVER_INTENT,而且在上一次服务被杀死前会去调用stopSelf方法停止服务。其中START_REDELIVER_INTENT意味着当Service因内存不足而被系统kill后,则会重建服务,并通过传递给服务的最后一个 Intent 调用 onStartCommand(),此时Intent时有值的。

START_FLAG_RETRY该flag代表当onStartCommand调用后一直没有返回值时,会尝试重新去调用onStartCommand()。

startId:指明当前服务的唯一ID,与stopSelfResult (int startId)配合使用,stopSelfResult 可以更安全地根据ID停止服务。

实际上onStartCommand的返回值int类型才是最最值得注意的,它有三种可选值, START_STICKY,START_NOT_STICKY,START_REDELIVER_INTENT,它们具体含义如下:

START_STICKY: 当Service因内存不足而被系统kill后,一段时间后内存再次空闲时,系统将会尝试重新创建此Service,一旦创建成功后将回调onStartCommand方法,但其中的Intent将是null,除非有挂起的Intent,如pendingintent,这个状态下比较适用于不执行命令、但无限期运行并等待作业的媒体播放器或类似服务。

START_NOT_STICKY: 当Service因内存不足而被系统kill后,即使系统内存再次空闲时,系统也不会尝试重新创建此Service。除非程序中再次调用startService启动此Service,这是最安全的选项,可以避免在不必要时以及应用能够轻松重启所有未完成的作业时运行服务。

START_REDELIVER_INTENT:当Service因内存不足而被系统kill后,则会重建服务,并通过传递给服务的最后一个 Intent 调用onStartCommand(),任何挂起 Intent均依次传递。与START_STICKY不同的是,其中的传递的Intent将是非空,是最后一次调用startService中的intent。这个值适用于主动执行应该立即恢复的作业(例如下载文件)的服务。

onDestroy()

当服务不再使用且将被销毁时,系统将调用此方法。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等,这是服务接收的最后一个调用。

2. bindService()绑定服务

虽然服务是在活动(Activity)里启动的,但在启动了服务后,活动与服务基本上就没有什么关系了。我们调用了startService()方法来启东MyService这个服务,然后MyService的OnCreate()和onStartCommand()方法就会得到执行,之后服务会一直处于运行状态,但是具体运行的是什么逻辑,活动就控制不了了。那么我们该如何在活动中去控制Service呢,这就需要借助onBind()方法了。

31b70c18ea06

创建一个DownloadBinder类,并继承自Binder,然后在其内部模拟开始下和查看下载进度的方法,分别打印下日志信息。在MyService中创建DownloadBinder 的实例,然后在onBind()方法中返回这个实例,这样MyService中的工作就全部完成了。

31b70c18ea06

首先创建了一个ServiceConnection 的匿名类,在里面重写了onServiceConnected()方法和onServiceDisconnected()方法,这两个方法分别会在活动与服务成功绑定以及解除绑定的时候调用。在onServiceConnected()方法中,通过向下转型得到了DownloadBinder实例,有了这个实例,我们就可以进行操作服务了。

在这里我们可以看到也是需要Intent对象来实现的,和启动服务不一样的是:启动服务时 startService(),而绑定服务的时候是bindService(),bindService()方法接收3个参数,第一个参数就是Intent对象,第二个参数就是ServiceConnection 的实例,第三个参数BIND_AUTO_CREATE 表示活动和服务进行绑定后自动创建服务。这会使得MyService中的OnCreate()方法得到执行,但是不会执行onStartCommand()方法。

我们想要解除活动和服务之间的绑定,就需要调用unbindService()方法,传入当前的ServiceConnection实例即可。

需要注意的是,任何一个服务在整个应用程序范围内都是通用多的,MyService可以和任何一个活动进行绑定,绑定完成后它们都可以获取相同的DownloadBinder实例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值