Android初级基础知识复习(十九) —— 服务Service基础

本文详细介绍了Android Service的生命周期,包括onCreate、onStartCommand、onDestroy等关键方法,并探讨了普通启停、立即绑定和延迟绑定三种启动方式下的生命周期变化。此外,还讲解了如何将Service推送到前台运行,以及使用startForeground和stopForeground方法。对于开发者来说,理解Service的生命周期对于优化应用后台服务的管理和资源使用至关重要。

Service的生命周期

服务Service是Android的四大组件之一,常用在看不见页面的高级场合,。既然Android有系统服务,App也可以有自己的服务。Service与Activity相比,不同之处在于没有对应的页面,相同之处在于有生命周期。
下面是Service与生命周期有关的方法说明。

  1. onCreate:创建服务。
  2. onStart:开始服务,Android 2.0以下版本使用,现已废弃。
  3. onStartCommand:开始服务,Android 2.0及以上版本使用。该函数的返回值说明见表6-5。
    在这里插入图片描述
  4. onDestroy:销毁服务。
  5. onBind:绑定服务。
  6. onRebind:重新绑定。该方法只有当上次onUnbind返回true的时候才会被调用。
  7. onUnbind:解除绑定。返回值为true表示允许再次绑定,再绑定时调用onRebind方法;返回值为false 表示只能绑定一次,不能再次绑定,默认为false。

看来Service的生命周期也不简单,分好几种生命周期方法。原因是服务存在多种启停方式,如普通启 停、立即绑定、延迟绑定,每种启停方式都对应不同的周期方法。下面分别叙述3种启停方式及其生命周期说明。

1. 普通启停

普通启停是最简单的用法。下面是该方式的服务代码:
在这里插入图片描述
当然,也可以在Intent对象中传 递参数信息。示例的调用代码如下:

// 创建一个通往普通服务的意图 
Intent intent = new Intent(this, NormalService.class); 
// 启动指定意图的服务 
startService(intent);

普通启停方式的服务生命周期可通过打印日志观察,也可在页面上直接显示日志。启动服务依次调用 了onCreateonStartCommand方法,停止服务调用了onDestroy方法。

2.立即绑定

绑定方式的服务定义有所不同,因为绑定的服务可能运行于另一个进程,所以必须定义一个Binder对象用来进行进程间的通信。下面是一个绑定方式的服务代码:
在这里插入图片描述
这个服务在绑定时会打印日志“绑定服务开始旅程!”,在解除绑定时会打印日志“绑定服务结束旅 程!”。在Activity中,绑定/解绑服务的做法与普通方式不同,首先要定义一个ServiceConnection的服务连 接对象,然后调用bindService方法或unbindService方法进行绑定或解绑操作。

接下来,继续观察立即绑定方式的生命周期,该方式的服务周期日志。其中,立即绑定时的界面,此时依次调用onCreate和onBind方法;立即解绑时的界面,此时依次调用onUnbind和onDestroy方法。

3. 延迟绑定

延迟绑定与立即绑定的区别在于:延迟绑定是在页面上先通过startService方法启动服务,然后通过 bindService方法绑定已存在的服务。这样一来,因为启动操作在先,所以解绑操作只能撤销绑定操作,而不能撤销启动操作。由于解绑服务不能停止服务,因此存在再次绑定服务的可能。

从日志中可以看到,延迟绑定与立即绑定两种方式的生命周期区别在于:
(1)延迟绑定的首次绑定操作只调用onBind方法,再次绑定只调用onRebind方法(是否允许再次绑定要看上次onUnbind方法的返回值)。
(2)延迟绑定的解绑操作只调用onUnbind方法。

推送服务到前台

服务没有自己的布局文件,也就意味着无法直接在页面上展示,要想了解服务的运行情况,要么通过 打印日志,要么获取某个页面的静态对象,然后在该页面上显示运行结果。然而活动页面有自身的生命周 期,极有可能发生服务尚在运行但页面早已退出的情况,所以该方式不可靠。幸好,服务不只能在外部进行启停或绑定,还能在内部模拟启停,当然仅是模拟而已。
服务内部的启停方法也有对应的两个函数。

  1. startForeground:把当前服务切换到前台运行。第一个参数表示通知的编号,第二个参数表示 Notification对象,意味着切换到前台就是展示到通知栏。
  2. stopForeground:停止前台运行。参数为true表示清除通知,参数为false表示不清除。

注意,从Android 9.0开始,要想在服务中正常调用startForeground方法,还需修改 AndroidManifest.xml,添加如下所示的前台服务权限配置:

<!-- 允许前台服务 --> 
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

服务在前台运行的一个常见的应用是音乐播放器,即使用户离开了播放器页面,手机仍然能在后台继 续播放音乐,同时还能在通知栏查看播放进度,控制播放与暂停操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值