关于android 锁屏应用屏蔽home键的总结

这几天做一个锁屏的项目,锁屏的难点在于返回键和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键

用过真机测试过,魅族,努比亚,本人也测试过,一些机型还没测试过,并不知道能不能实现

第一次写博客,有漏洞,或者不好的地方请指教。感谢观看!




展开阅读全文

没有更多推荐了,返回首页