android間接實現前後臺判斷

Android項目裏要判斷是Home按鍵。可是Home鍵不提供監聽。麻煩。。
在應用裏,按了home鍵就是被調到後臺,再回到應用就是後臺調到前臺,那看看有沒有可以判斷應用前後臺的方法吧。
如果整個項目只有一個Activity,那麼簡單了,利用生命週期函數,在onResume()方法裏可以簡單判斷後臺還是前臺。
可是項目裏有N多個Activity,調用關係複雜,生命週期耦合太多,,判斷方法容易出錯。
網上有辦法通過ActivityManager獲得棧頂的Activity的包名,然後判斷是不是自己應用。
沒有采用,因爲Activity實在太多,每一個都加入這個方法,或者加入方法調用,這個工作量阿。。。
當然這也是一個備選方案了。。。


忽然發現項目裏所有Activity都繼承自一個BaseAcitvity(BaseAcitvity再繼承自android的Acitvity類)。看來可以加判斷方法到這個BaseAcitvity類裏。
但是每一次進入都要調用調用這個方法,獲取服務,獲取列表,獲取應用信息,最後只爲了獲得一個標記位的值,感覺好浪費。
繼續作爲備選方案吧。。


重新思考。既然已經被調到後臺,那就是說,當前應用的所有頁面都不在前臺顯示,
也就是說,當前應用的所有Acivity都至少走完了onPause()方法。
而且,我們應用的所有acitivity都繼承自一個BaseAcitvity,那麼在BaseAcitvity的onPause()裏做個計數吧,



計數方法如下:

BaseAcitvity的onResume()或者onStart()方法裏,++count;
BaseAcitvity的onPause()或者onStop()方法裏,--count;


判斷方法如下:
在onRestart()方法裏判斷count,如果<=0(事實上,不應該小於0),那麼就是從後臺進入了前臺。


如此,應用裏每一個Activity都會在前臺時++count,移入後臺時--count。
count好像堆棧計數,前臺顯示時就是push,計數加1;後臺不顯示時就是pop,計數減1。
堆棧裏有Activity就是應用在前臺,計數肯定>1;計數爲0說明堆棧沒有Activity,說明沒有Activity在顯示,應用在後臺。


由此判斷得以簡單高效判斷應用自身前後臺狀態,間接實現(部分的)Home鍵判斷。


之所以是部分的Home鍵判斷,因爲這個方法只能判斷前臺後臺狀態,不是根據Home的key事件來判斷的。

所以,如果應用被其他應用暫時中斷,比如來電,鎖屏等等,也會被當作Home事件來處理。


後記:這個方法在滅屏時會出問題,我是在onResume和onStop方法裏計數,滅屏再點亮只會執行onPause和onPause,這樣計數就會錯亂。

所以對這個方法改進一下:

1 BaseActivity中聲明一個靜態的hashMap。

2 每一個繼承自BaseActivity的Activity需要實現一個方法getAcitivityID(),返回一個ID,每個AcitivityID都不相同。

3 在onCreate、onStart、onResume 裏操作hashMap,添加getAcitivityID()返回值,如果存在則不添加。

4 在onDestroy、onStop、onPause裏操作hashMap,刪除getAcitvityID()返回值,如果不存在則不操作。

5 子AcitvityID可以在調用super.onSart()或者super.onReume()前,判斷hashMap的長度,如果是0,則是從後臺調入前臺的。


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