WindowManager中悬浮窗的返回键事件处理

来源:互联网 发布:linux 下载速度很慢 编辑:程序博客网 时间:2024/06/13 21:24

  今天在优化公司指纹应用锁时遇到了这样一个问题:指纹应用锁锁住应用界面如何监听返回键,处理点击事件?下面来分析一下这个问题。
  首先介绍一下指纹应用锁逻辑,首先把要锁的应用保存到数据库,开启指纹应用锁服务,监听打开的应用,当打开的应用在数据库中能查到,那么需要加锁,此时会通过WindowManager添加一个悬浮窗挡住应用。
当我们不解锁时需要按返回键跳转到桌面,此时就需要监听返回键,处理返回键。
先贴一段添加悬浮窗的代码:

public void lockApp(String topPackageName)    {            mParams = new WindowManager.LayoutParams(                WindowManager.LayoutParams.MATCH_PARENT,                WindowManager.LayoutParams.MATCH_PARENT,                WindowManager.LayoutParams.TYPE_PHONE,                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |                 WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL  |                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |                WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD, PixelFormat.TRANSLUCENT);           mStatusBarManager = (StatusBarManager)getSystemService(Context.STATUS_BAR_SERVICE);           Flags|=StatusBarManager.DISABLE_RECENT;//最近任务按钮           Flags|=StatusBarManager.DISABLE_HOME;//home按钮           mStatusBarManager.disable(Flags);//屏蔽这两个按钮           if (null != mWindowManager && null != mParams) {                mWindowManager.addView(mLockscreenView, mParams);//添加悬浮窗           }    }
public void unlock()    {         mStatusBarManager.disable(StatusBarManager.DISABLE_NONE);         mFingerprintHelper.stopListening();         if (null != mWindowManager && null != mLockscreenView) {             mWindowManager.removeView(mLockscreenView);//移除悬浮窗         }     }

监听返回键:

mLockscreenView.setOnKeyListener(new OnKeyListener() {                 @Override     public boolean onKey(View v, int keyCode, KeyEvent event) {            if (keyCode == KeyEvent.KEYCODE_BACK) {                //add by xiaoxiansen 20161123 satrt                backToHome(mContext);                //add by xiaoxiansen 20161123 end                if (null != mWindowManager && null != mLockscreenView) {                    mWindowManager.removeView(mLockscreenView);                }                return true;        }        return false;     } });

这样写编译发现并没什么卵用,我们需要添加如下代码:

 mLockscreenView.setFocusableInTouchMode(true);

并且我们在设置 WindowManager.LayoutParams时不能设置FLAG_NOT_FOCUSABLE,否则又是然并软。

原创粉丝点击