这几天做一个锁屏的项目,锁屏的难点在于返回键和home键的屏蔽,关于home键的屏蔽也困扰了我很久,
最后还是顺利屏蔽掉了,这里写出来总结一下。
1、返回键的屏蔽,直接贴代码,原理 监听返回键,让他不做任何操作。(比较简单,直接贴代码- -)
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK){
return true;
}
return super.onKeyDown(keyCode, event);
}
2、home键屏蔽,这个是比较麻烦的,网上教程和写法有很多,这里我归纳一下。
第一步、先监听到home键的点击, 网上教程也比较多,这里直接贴代码
public class HomeReceiver extends BroadcastReceiver {
static public final String SYSTEM_DIALOG_REASON_KEY = "reason";
static public final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
static public final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
@Override
public void onReceive(Context arg0, Intent arg1) {
String action = arg1.getAction();
//按下Home键会发送ACTION_CLOSE_SYSTEM_DIALOGS的广播
if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
String reason = arg1.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
if (reason != null) {
if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
Log.d("ddd","按了home");
}
}
}
}
}
HomeReceiver innerReceiver = newHomeReceiver();//注册广播
IntentFilter intentFilter = newIntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
registerReceiver(innerReceiver, intentFilter);
广播记得在manifest里声明喔
<receiver
android:name=".Service.HomeReceiver"//类名
android:enabled="true"
android:exported="true"></receiver>
测试按home键,应该就能监听到了。接下来开始屏蔽home键的跳转。以下总结了几点方法
1,用悬浮窗,直接在windowManager 上添加view,把锁屏界面显示在手机界面上,这样即使跳转到手机界面上,也能
显示出锁屏界面。思路如下
当手机按下home键时(以用上面的代码监听到了)
WindowManager m=(WindowManager) arg0.getSystemService(Context.WINDOW_SERVICE);//获取windowmanager
View v=View.inflate(c,R.layout.activity_locking,null);//展开布局
WindowManager.LayoutParams params=new WindowManager.LayoutParams();//设置一些参数
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = WindowManager.LayoutParams.MATCH_PARENT;
params.type = WindowManager.LayoutParams.TYPE_PHONE;
params.format = PixelFormat.TRANSLUCENT;
params.flags = WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED ;
m.addView(v,params);//添加上
个人不推荐这种方法,虽然能显示,但权限问题十分麻烦- -,网上也有很多关于不同机型,不同android版本获取权限的代码
这里就不说啦。
2、设置一个透明的activity为手机主界面 配置home键的意图,来抢夺home键的主界面,这种方法我也写过,不过在魅族
上测试时,直接就pass掉了,连弹出使用以下应用选择主界面 的弹窗都没有- -。
3、(推荐)有人可能想到,这里可以监听到home键,那就直接重新跳转到锁屏界面不就可以了吗,当然这个我也测试过
坑的是,android 早就知道这个漏洞,所以这样写会有3秒的延迟跳转,难道这种方法就这样gg了吗?不
这里可以利用PendingIntent来配置Intent ,以实现立马跳转,无延迟跳转。
代码很简单,在onReceive()中监听到home键后,
旧方法(有延迟) Intent i = new Intent(context,xxxx.class)//xxx为锁屏界面的activity
context.startActivity(i);
利用PendingIntent
Intent intent=newIntent(c,LockingActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent =PendingIntent.getActivity(c,0, intent, 0);
try{
pendingIntent.send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
这样处理后,按home键就可以停留在锁屏界面了,不过还有一个弊端,就是当home键点击过快时,应用还是
会被弹出,解决方案,让其多发几遍意图,因为这里是用Intent.FLAG_ACTIVITY_NEW_TASK
设置成这种启动方式,每次启动的时候会先判断栈里有没有这个activity,有的话就直接显示出来,不用去新建,不会重新加载,
为了解决上文提到的被弹出的问题,这里我用了一个循环
for(int j=0;j<10;j++){
Intent intent=new Intent(c,LockingActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent =
PendingIntent.getActivity(c, 0, intent, 0);
try {
pendingIntent.send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
}
当按下home键时,循环10次,也就是重复打开锁屏界面,结果也成功的屏蔽了home键
用过真机测试过,魅族,努比亚,本人也测试过,一些机型还没测试过,并不知道能不能实现
第一次写博客,有漏洞,或者不好的地方请指教。感谢观看!