Android学习 - 自定义锁屏基本原理

来源:互联网 发布:冷白皮mac粉色系口红 编辑:程序博客网 时间:2024/06/05 07:30

1、自定义锁屏其实就是在系统锁屏后唤醒的时候显示自己定义的activity页面,系统在锁屏和锁屏唤醒的时候会发送广播消息

android.intent.action.SCREEN_ONandroid.intent.action.SCREEN_OFF

接收这两个广播不能静态注册broadcastreceiver(可能因为有序广播的优先级问题),动态注册不能放到activity中,因为动态注册必须要在activity消亡的时候调用unregisterReceiver,会随着activity的解锁消失而不能再接收广播。一般的办法是在activity起来后马上start一个service,这个service里动态注册一个broadcastreceiver,broadcastreceiver里接收到SCREEN_ON消息后启动锁屏activitty。为了保证broadcastreceiver任何时候都可以接收到SCREEN_ON,service必须常驻在系统内,所以要接收开机消息android.intent.action.BOOT_COMPLETED,这里使用静态注册可以接收,接收到开机消息后马上启动service。service可能在运行的过程中被系统停止,所以要在ondestory方法里重启自己,当然ondestory方法需要先unregisterReceiver再重启自己,否则会因为没有解注册广播而异常。

private void registerScreenActionReceiver() {final IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_SCREEN_OFF);filter.addAction(Intent.ACTION_SCREEN_ON);registerReceiver(receiver, filter);}private final BroadcastReceiver receiver = new BroadcastReceiver() {@Overridepublic void onReceive(final Context context, final Intent intent) {// Do your action here}};
这实在是很麻烦的,而且还占用很多资源。这是PowerManager那边在发这个广播的时候,做了限制,限制只能有register到代码中的receiver才能接收。那怎么才能保证我的服务一直是启动状态呢,其实还有另一个Action可以反映出用户正在使用手机的行为,每个用户在使用手机的时候,首先按电源键将屏幕点亮,紧接着就是解锁。解锁动作通过android.intent.action.USER_PRESENT发送出来,我们就能识别出该用户进入了home界面,也就能启动我们相应的服务了,不管你是要谈对话框welcome用户,还是后台启动程序升级服务,该Action 在AndroidManifest.xml中可以监听得到。

那怎么才能保证我的服务一直是启动状态呢,其实还有另一个Action可以反映出用户正在使用手机的行为,每个用户在使用手机的时候,首先按电源键将屏幕点亮,紧接着就是解锁。解锁动作通过android.intent.action.USER_PRESENT发送出来,我们就能识别出该用户进入了home界面,也就能启动我们相应的服务了,不管你是要谈对话框welcome用户,还是后台启动程序升级服务,该Action在AndroidManifest.xml中可以监听得到。

<application android:icon="@drawable/icon" android:label="@string/app_name">        <activity android:name=".ScreenActionTestActivity"            android:label="@string/app_name">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <receiver android:name=".ActionReceiver">            <intent-filter android:priority="90000">                <action android:name="android.intent.action.USER_PRESENT" />            </intent-filter>        </receiver>    </application>  

2、为了让系统的锁屏消失,只显示我们定义的activity,可以采用如下方法:

KeyguardManager mKeyguardManager = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);KeyguardManager.KeyguardLockmKeyguardLock = mKeyguardManager.newKeyguardLock("zdLock 1");mKeyguardLock.disableKeyguard();

锁屏管理类叫KeyguardManager,通过调用其内部类KeyguardLockmKeyguardLock的对象的disableKeyguard方法可以取消系统锁屏,newKeyguardLock的参数用于标识是谁隐藏了系统锁屏,上述方法不推荐使用,可以使用如下替代方法。在自定义锁屏activity的oncreate里调用:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 

3、在锁屏activity里使用风格:android:theme="@android:style/Theme.Wallpaper",使acitvity的风格定义为锁屏风格Wallpaper。


0 0