Android手機HOME鍵的監聽一直是個很頭疼的問題,系統禁止用戶重寫HOME鍵的監聽方法,就導致部分手機可能出現未知的問題。輸入法就在部分手機存在始料未及的問題。
在部分手機上,發現在鍵盤彈出的情況下,點擊返回鍵會首先隱藏鍵盤,再次點擊才會執行返回操作。然而點擊HIOME鍵呢?發現并不是首先隱藏鍵盤再次點擊才執行HOME鍵的操作。而是直接執行了HOME鍵的操作,系統返回了桌面,而輸入法卻沒有隱藏。為什么?輸入法服務是系統服務,我們只是繼承了該服務實現自己的輸入功能,這是由于系統的漏洞嗎?還是自己輸入法中漏掉了什么東西?還是覆蓋掉了某些不應該覆蓋的方法?
測試其他輸入法發現沒有這個問題。不知道是其他輸入法做了修復還是自己輸入法存在的問題。不管怎么著,有問題解決問題吧。首先想到的方案就是點擊HOME鍵監聽點擊結果,在監聽到點擊操作后,執行隱藏鍵盤的操作。那么技術問題就出現了:監聽HOME鍵的點擊。
Android系統對HOME鍵的點擊有發送對應的廣播,即:
Intent.ACTION_CLOSE_SYSTEM_DIALOGS。那么就實現對該廣播的監聽的。
第一種方式:靜態方式注冊監聽:
首先,在清單文件中注冊廣播接收者,接收系統廣播:
然后,實現廣播接收者主要是監聽兩種動作:homekey和recentapps,發現點擊HOME調用的是homekey動作,長按HOME鍵是調用了recentapps動作,故實現監聽這兩種動作即可:
然后使用紅米手機執行程序,點擊HOME鍵,查看效果,期待日志的產生。結果讓人失望,竟然無日志打印!為什么呢?同樣的方法,在半年前明明是達到效果的。是小米手機做了特殊處理還是Android系統做了系統級別的限制,這個不可而知了。既然靜態不行,那就動態試試。
第二種方式:動態方式注冊監聽:
為了實現類似靜態的效果,在整個程序內監聽HOME鍵的點擊,所以我們在Application中進行動態廣播的注冊,代碼如下:
發現,終于,日志出現了!是時候盡情慶祝吧。不過,等等好像這種方式也有漏洞。
經測試組測試發現,在部分國產定制ROM中,發現一個奇怪的現象,就是使用這種方式依然無法達到監聽HOME鍵的目的比如說在奇酷手機中,點擊HOME鍵依舊什么日志都不打印,這又是為什么呢?經過研究發現,注冊廣播的地方需要在主線程中進行,并且對代碼進行改進,終于實現了對奇酷的監聽。由于手機資源有限,不能對所有手機進行測試,希望大家有更好的方式或者想法能夠及時反饋。
總結:
1,HOME鍵的點擊操作在清單文件中靜態注冊無法達到預期效果。其中的原因暫不明確,可能是系統限制了三方應用對該廣播的靜態監聽,也可能是廣播優先級問題。
2,在動態注冊廣播時,為了實現靜態注冊的效果,可以考慮在Application中注冊。但是個人總是覺得這種實現不是最優的實現。暫時沒有找的好的替換方案。在Application中注冊需要注意一點就是要保證在主線程中注冊,使用Application的對象。Application為了保證啟動速度,經常會在子線程中進行一些初始化操作,廣播監聽需要在主進程中進行。
3,針對國產廠商定制的ROM需要重點關注。部分廠商不再遵循Google定義的規范,取消廣播,攔截廣播的情況經常出現,在做機型適配的時候最好能夠盡量全面的測試不同機型。這個真沒有很好的解決方案。