关于屏蔽home键的理解

这个主要用于锁屏软件,研究了下摸手和toddler lock,先说下摸手锁屏,那个无限扩展的功能确实有些意思,改天再详细写一下,仔细的看了下两个软件的manifest,首先是都是有一个和home相同响应的activity,属性如下:

 

其次就是利用packageManager,这是个很强大的东西, IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_VIEW); filter.addCategory(Intent.CATEGORY_BROWSABLE); filter.addCategory(Intent.CATEGORY_DEFAULT); filter.addDataScheme("http"); getPackageManager().addPreferredActivity(filter, 0, null, new ComponentName("com.android.browser","com.android.browser.BrowserActivity")); // getPackageManager().addPackageToPreferred("com.android.browser"); mApps = getPackageManager().queryIntentActivities(it, 0); if(mApps == null) { return; } Log.d("browsertest", mApps.size()+""); for(int i = 0; i >"+mApps.get(i).preferredOrder); Log.d("", mApps.get(i).priority+""); } ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); ComponentName cn = am.getRunningTasks(1).get(0).topActivity; Log.d("", "pkg:"+cn.getPackageName()); Log.d("", "cls:"+cn.getClassName()); ,还有很多东西待研究

 

   android:name="android.permission.GET_TASKS"
  >

   android:name="android.permission.SET_PREFERRED_APPLICATIONS"
  >

 

另外这个权限也值得研究

   android:name="android.permission.DISABLE_KEYGUARD"
  >

 

后记,

public void onAttachedToWindow() { this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); super.onAttachedToWindow(); }  

  在activity中加上这段代码就可以屏蔽home,至于为什么,因为android系统自己对与home键power键在PhoneWindowManager中做了处理,不会返回到上层应用的,但是我在看这部分代码的时候看到:

 


 

/frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java 1089行 if (code == KeyEvent.KEYCODE_HOME) { // If a system window has focus, then it doesn't make sense // right now to interact with applications. WindowManager.LayoutParams attrs = win != null ? win.getAttrs() : null; if (attrs != null) { final int type = attrs.type; if (type == WindowManager.LayoutParams.TYPE_KEYGUARD || type == WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG) { // the "app" is keyguard, so give it the key return false; } final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length; for (int i=0; i

 

     type == WindowManager.LayoutParams.TYPE_KEYGUARD这一句,我们可以看到,android对于锁屏特殊判断了,所以我就模拟这个进行的实现,只是有一点,activity中重写onAttachedToWindow()方法需要api 5以上。 

 

 

 

另外声明,此处仅限于技术讨论,如对摸手或者toddler lock有所侵权,请通知,我会删除此博客

引用了,http://zhifeiji512.iteye.com/blog/1055358

你可能感兴趣的:(android)