如何關閉跨進程的前臺服務?

工作中遇到了這樣一個問題:App支持記步功能,在開發的時候我把它放到了單獨的進程中,爲了能夠實現App在後臺也能記步的功能,在進程中開啓了一個前臺服務。之前由於產品的功能模塊比較少,所以不支持它的關閉與開啓,但是隨着軟件的迭代更新,功能模塊越來越多,於是產品需要實現這樣的需求:當用戶把步數的功能拿掉後,對應的記步通知也要消失;把步數功能添加進導航欄,記步的通知也要隨之出現在通知欄。

在這裏插入圖片描述

上圖是添加了記步模塊,於是在通知欄顯示了一條記步的通知。如果用戶關閉了記步模塊,那麼通知欄則不會顯示記步的通知。

效果圖:

在這裏插入圖片描述

在實現之前做過很多嘗試,比如關閉通知、關閉服務、關閉所在進程。但都無法實現所要的效果(可能跟我的水平有關),最終在我學長的指引下找到了解決方法。

解決問題的關鍵點是要先確定對象,就像我之前做過的嘗試一樣,沒有把所要操作的對象定位清楚。記步的確是在一個單獨的進程中,通過服務開啓了記步的功能,爲了保活,於是把服務設置爲前臺服務,所以會在在通知欄顯示了一條通知。但關鍵點在於它是一個前臺服務,所以我們應該想辦法把前臺服務關閉掉。

在service中有這樣一個方法,它是用來關閉前臺服務的。

在這裏插入圖片描述

注意看stopForeground()的參數:removeNotification,所以通過關閉前臺服務是可以關閉與之相關的通知的。

既然我們找到了解決的關鍵方法,那麼現在我們就要解決如何觸發它來實現關閉服務的邏輯。

我採用的方法是通過廣播來實現的。

首先,自定義一個廣播接收器:

在這裏插入圖片描述

在onReceiver中調用關閉服務的方法;

其次,註冊廣播:

在這裏插入圖片描述

記得在onDestory中取消註冊。

最後,在刷新導航欄的地方處理髮送廣播以及開啓記步:

在這裏插入圖片描述

最終我們就實現了需求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章