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

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

android.intent.action.SCREEN_ON
android.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() {
	@Override
	public 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中可以监听得到。

    
        
            
                
                
            
        
        
            
                
            
        
  

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。


你可能感兴趣的:(Android)