開發鎖屏程序的時候我們要面臨的重要問題無疑是如何屏蔽三個按鍵,Back,Home,Menu
看似簡單的功能,實現起來卻並不是那么容易。
【屏蔽Back按鍵】
相對來說,屏蔽Back鍵是比較簡單的,只需要在我們的Activity中重寫onKeyDown方法,並在其中對Back按鍵進行攔截即可,代碼如下
//屏蔽back @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: return true; } return super.onKeyDown(keyCode, event); }
【屏蔽Menu按鍵】
屏蔽Menu按鍵看似可以用和Back按鍵一樣的處理方法,但是事實上並不是這樣,由於在4.0以上的系統中,大多數情況下點擊Menu按鍵會出現Recent app頁面。
所以使用上面的方法並不管用。
這時候,我們可以采用另外一種方法——檢測我們的窗體是否失去焦點,如果失去,就把彈出的窗體給縮回去。這個方法也可以防止下拉狀態欄
代碼如下
//屏蔽menu @Override public void onWindowFocusChanged(boolean pHasWindowFocus) { super.onWindowFocusChanged(pHasWindowFocus); if (!pHasWindowFocus) { sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); } }
【屏蔽Home按鍵】
接下來我們要面對的是最復雜的部分,屏蔽Home按鍵,Home按鍵由於其特殊性,無法被攔截。
但是我們可以參考其他鎖屏應用,設置一個自己的主屏幕應用,讓每次點擊Home按鍵的時候啟動我們自己的主屏幕,再進行判斷,是繼續停留鎖屏界面還是啟動系統 的主屏幕頁面。
我們的主屏幕界面Activity應該是沒有窗體的,這樣我們點擊Home的時候就不會看到額外的窗體,讓用戶體驗更好。
下面我們用代碼來做講解
public class Home extends Activity { HomeChoice homeChoice; //HomeChoice為設置和啟動主屏幕類 private SharedPreferences sharedPreferences; private Editor editor; private boolean isLock; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); homeChoice = new HomeChoice(this); sharedPreferences = getSharedPreferences("homeChoice", MODE_PRIVATE); } @Override protected void onStart() { super.onStart(); isLock = sharedPreferences.getBoolean("IsLocked",false); //判斷鎖屏Activity是否在前台 if (isLock) { Intent mIntent = new Intent(this, ScreenLockActivity.class); startActivity(mIntent); finish(); } //不在前台則啟動預設的主屏 else { try { homeChoice.originalHome();//啟動預設主屏 } catch (Exception e) { homeChoice.chooseBackHome();//還沒有預設,讓用戶預設 } } } }
為了讓這個界面在按下Home時被啟動,我們需要在AndroidManifest中進行設置,如下
<activity android:name=".Home" android:theme="@android:style/Theme.NoDisplay"//設置主題為不可見 > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" />//可以作為桌面被識別 <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
我們還需要在系統設置里將我們的應用設置為主屏幕
例如,在原生的系統中可以這樣設置
在MIUI中可以這樣設置
其他應用管理-->默認應用設置-->桌面
通過上面的步驟,我們就可以完成對Home按鍵的屏蔽了
上面的代碼只是為了讓大家更好的理解如何屏蔽按鍵的原理,並不完整,我已經將一個完整的Demo代碼上傳到了GitHub上面,如果大家有需要可以去下下來試一下。
地址:https://github.com/u3shadow/ScreenLocker
最近由於涉及到了鎖屏方面的開發,所以找了很久這方面的資料,但是都不完善,很痛苦。希望這篇文章能幫助到大家。