西狂杨过 2010-05-14
以前就想过要实现一个锁屏程序,一直没有动手,今天尝试了一下。
首先,得听到系统的屏幕关闭的广播,这个广播是什么呢?不知道啊。那怎么办?搜呗!搜索,可以搜到,不过我找到一个可以知道系统所有广播的办法:我的 sdk是1.5的,进入sdk主目录,然后进入platforms\android-1.5\data目录,里面有activity_actions.txt,broadcast_actions.txt等文本文档,activity_actions.txt里面是系 统的所有action,broadcast_actions里面是系统的所有广播。从这里面我们可以找到屏幕关闭的广 播:android.intent.action.SCREEN_OFF。
然后我写了个BroadcastReceiver,
class ScreenOffListener extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(LOGIT) Log.d(TAG, "screen off"); } }
然后在manifest里面注册,
<receiver android:name=".ScreenOffListener"> <intent-filter> <action android:name="android.intent.action.SCREEN_OFF" /> </intent-filter> </receiver>
然后信心满满的在我的G2上测试。可是,广播怎么都收不到。郁闷了。
换个方法!写一个activity,在里面注册这个 BroadcastReceiver。然后再次测试,结果。。。嘿嘿,成功收到广播。
看来在全局接收screenoff广播是不行的,只能程序里面注册监听,原因暂时不管了,有时间再研究。
继续这个话题。在activity里面注册BroadcastReceiver,如果这个activity切换到后台了,也就是stop了,BroadcastReceiver必须得unregister,然后就听不到screenoff广播了。怎么办呢?要达到这个目的,只能使用Service了。然后我写了一个Service,在里面注册BroadcastReceiver,监听screenoff,嘿嘿,ok了。然后这个服务一被关闭,马上再启动,这样就可以一直听到广播了。
广播的问题解决了,接下来就是锁屏主程序了。Activity可以截获大部分的键,只有endcall和home键截获不了。截获键盘的代码:
@Override public boolean dispatchKeyEvent(KeyEvent event) { return true; }
Endcall没必要截获,因为要锁屏,必须要能关闭屏幕。而home键,暂时没想到什么好办法。大家有什么办法,共同讨论讨论吧^-^。