工作中遇到了这样一个问题:App支持记步功能,在开发的时候我把它放到了单独的进程中,为了能够实现App在后台也能记步的功能,在进程中开启了一个前台服务。之前由于产品的功能模块比较少,所以不支持它的关闭与开启,但是随着软件的迭代更新,功能模块越来越多,于是产品需要实现这样的需求:当用户把步数的功能拿掉后,对应的记步通知也要消失;把步数功能添加进导航栏,记步的通知也要随之出现在通知栏。
上图是添加了记步模块,于是在通知栏显示了一条记步的通知。如果用户关闭了记步模块,那么通知栏则不会显示记步的通知。
效果图:
在实现之前做过很多尝试,比如关闭通知、关闭服务、关闭所在进程。但都无法实现所要的效果(可能跟我的水平有关),最终在我学长的指引下找到了解决方法。
解决问题的关键点是要先确定对象,就像我之前做过的尝试一样,没有把所要操作的对象定位清楚。记步的确是在一个单独的进程中,通过服务开启了记步的功能,为了保活,于是把服务设置为前台服务,所以会在在通知栏显示了一条通知。但关键点在于它是一个前台服务,所以我们应该想办法把前台服务关闭掉。
在service中有这样一个方法,它是用来关闭前台服务的。
注意看stopForeground()的参数:removeNotification,所以通过关闭前台服务是可以关闭与之相关的通知的。
既然我们找到了解决的关键方法,那么现在我们就要解决如何触发它来实现关闭服务的逻辑。
我采用的方法是通过广播来实现的。
首先,自定义一个广播接收器:
在onReceiver中调用关闭服务的方法;
其次,注册广播:
记得在onDestory中取消注册。
最后,在刷新导航栏的地方处理发送广播以及开启记步:
最终我们就实现了需求。