Android4.0+锁屏程序开发——按键屏蔽篇
开发锁屏程序的时候我们要面临的重要问题无疑是如何屏蔽三个按键,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
最近由于涉及到了锁屏方面的开发,所以找了很久这方面的资料,但是都不完善,很痛苦。希望这篇文章能帮助到大家。