思捻如枫 2011-04-29
最近纠结于锁屏,参考资料可以知道实现思路:
第一部分:
http://stackoverflow.com/questions/4116001/android-lock-screen-widget
这里就不累述了。上面是摘自stackoverflow的一段评论。
现在问题,也是大家都面临的问题就是home键的屏蔽了。api中有这么个介绍:
boolean android.app.KeyguardManager.inKeyguardRestrictedInputMode()
If keyguard screen is showing or in restricted key input mode (i.e. in keyguard password emergency screen). When in such mode, certain keys, such as the Home key and the right soft keys, don't work.
See Also:android.view.WindowManagerPolicy.inKeyguardRestrictedKeyInputModeReturns:true if in keyguard restricted input mode.Wheninsuchmode,certainkeys,suchastheHomekeyandtherightsoftkeys,don'twork,这句话很纠结,don'twork.是说那些键不适用这个函数,还是说那些键也会屏蔽掉。真够蛋疼的。有谁搞定了,分享下。我也在努力搞定。搞定了分享给大家。第二部分:
上个项目已经完成,现在接着调研锁屏,把目前的消息广播给大家:
FLAG_SHOW_WHEN_LOCKED
FLAG_DISMISS_KEYGUARD
这两个属性好像也可以实现锁屏功能,但是在2.0测试的时候好像没有作用,点击home还是可以回到桌面。我之前一直纠结于把键盘上锁,这样就可以实现锁住home了。但是当我在oncreate里使用reenablekeyboard时,整个activity压根就不会显示了,程序运行了,但是activity不会把组件显示出来。但是此时其他键盘还可以屏蔽掉,但是home没法弄掉。如果可以实现上锁,那么1.6下就可以实现实现屏蔽Homel了。原因继续寻找中。在网上看到一个哥们有实现屏蔽home的例子,不过是在2.0之后才会有用,我查过源码1.6也有,但好像是没法给我们用。
原文是这样的:
@Override public void onAttachedToWindow() { // TODO Auto-generated method stub this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); super.onAttachedToWindow(); }
我建议用这种方式,用了就知道为什么了
@Override public void onAttachedToWindow() { // TODO Auto-generated method stub this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); super.onAttachedToWindow(); }
这种方式的确可以屏蔽home,而且可以打印出捕获的home的code。可以试试,目前这种方式可行,原因自己可以查看源码,有需要的哥们可以试试,我正在寻找更靠谱的办法,可以实现在更低版本里同样有用。希望大牛们也提出更好的解决方案。
第三部分:
时间过得很快,让我来把之前没写完的东西写完吧。这次主要写锁屏的屏蔽home吧,也许我们之前一直都太在意home键了。现在推荐一种新的做法。
使用WindowManager。
step1 :
获得:
WindowManager window = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
step2:
设置参数
WindowManager.LayoutParams param = new WindowManager.LayoutParams();
param.type = 2010;//2003也ok
..........
诸多参数请自己添加,不明白的请网上搜索资料或者api。这里就不提供介绍了。
step3:
把自己的view添加到窗口里:
window.addView(view, param);
现在可以测试了,主要原理就是就是将自己的界面设置为系统及窗口。各位要是有更好的思路,不妨一起讨论。