1. 程式人生 > >只要兩行程式碼,就能判斷一個App是否在前臺執行

只要兩行程式碼,就能判斷一個App是否在前臺執行

公司最近做專案有這樣的一個需求:當App在前臺執行的時候,不接受推送通知;當App在後臺執行的時候,接受推送通知。很顯然,這是一個非常常見的功能,我們在微信或者QQ就能體驗到這樣的功能。

首先分析一下,假如我們需要完成這樣的一個功能,谷歌官方有沒有給我們提供現成的介面供我們呼叫?聰明的人應該都知道,如果谷歌官方提供了相應的解決辦法,很有可能是回撥方法,因為用回撥方法來解決這個問題是很省記憶體的。

很可惜,谷歌並沒有給我們現成的介面去判斷該App是否是前臺應用還是後臺應用,至於網上的其他解決方案,我都親自試了一下,效果不是很好,多多少少有些毛病。於是決定自己研究一下,有沒有更簡潔的辦法。。。。。。以下便是我的結論,有興趣的可以自己看下去

首先弄清楚一個問題,當一個Activity啟動另外一個Activity的時候,這兩個Activity的生命週期是如何變化的?(為了方便,我們假設這兩個Activity的名字為“甲”Activity和“乙”Activity)

(請思考若干分鐘.........)

好了,現在我來告訴你答案:

答案①:(甲)onCreate->(甲)onStart()->(甲)onResume()->甲正在執行中,此時甲需要跳轉的到乙->(甲)onPause()->(甲)onStop()->(乙)onCreate->(乙)onStart()->(乙)onResume()->乙正在執行中

答案②:(甲)onCreate->(甲)onStart()->(甲)onResume()->甲正在執行中,此時甲需要跳轉的到乙->(甲)onPause()->(乙)onCreate->(乙)onStart()->(乙)onResume()->乙正在執行中->(甲)onStop()

這裡有兩個答案,請問哪個才是正確答案呢???(看仔細啦,一定要看仔細啦)其實在csdn上我在重要的地方標記了顏色,但是到掘金閱讀的時候就看不到顏色了,確實有點坑,想看原文的,可以點選我的部落格地址去看,原汁原味的~~~

(請思考若干分鐘.........)

好了,現在我來告訴你的答案:

我就不囉嗦了,正確答案是②,答案①是錯誤的,至於為什麼,自己去寫程式碼測試吧,實踐得真知,我就不貼程式碼了。

從答案②我們可以得出這樣一個結論,也就是當一個Activity啟動另外一個Activity的時候,會先執行onPause方法,然後去建立一個新的Activity,等到那個新的Activity啟動完成,完全展示在我們的手機上的時候,系統才會去呼叫上一個Activity的onStop方法,或者可以這樣說,只要我們的應用程式在前臺,onStart和onStop這兩個方法的執行次數肯定是成對出現的,如果沒有成對出現,那肯定不是前臺應用,自己好好體會~~~

那麼問題來了,我們要怎麼計算onStart()方法和onStop()方法的執行次數呢,一個app那麼多Activity,需要在每個Activity裡面寫方法豈不是很愚蠢!!!

這個問題好解決,寫一個BaseActivity,然後定義一個靜態的int,讓所有的Activity都繼承這個類,在BaseActivity的onStart()方法和onStop()方法體內對靜態的int進行操作,onStart()執行int++,在onStop()執行int--,當你要判斷該應用程式是否是前臺執行的時候,只要判斷這個靜態的int是否是0就好了,如果是0,說明所有的Activity都到後臺了,如果是1,說明該App在前臺執行。

如果還有不懂,就留言吧,我會給你解答的。