android-自定义锁屏界面

自定义锁屏,简单来说就是两方面,一是屏蔽掉系统锁屏,二是弹出自定义的锁屏界面。

一、屏蔽系统锁屏

这部分工作主要由两部分组成,首先是申请权限

其次是在我们自定义的锁屏界面操作系统锁屏,这部分有两种方法。第一种是使用KeyguardManager来实现

KeyguardManager mKeyguardManager = (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
	mKeyguardManager.newKeyguardLock("my_lockscreen").disableKeyguard();
这种方式不论是否安全锁屏都会禁掉,准确来说是disableKeyguard方法会禁掉锁屏服务,直到调用reenableKeyguard方法才会恢复。此外,这种方法自API13开始不被推荐使用了。

第二种是使用getWindow().addFlags的方式

//在keyguard在前显示应用程序窗口
	getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);  
	//彻底隐藏非安全验证的keyguard
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
这样,我们就实现了屏蔽系统锁屏的目的。接下来如何弹出自定义锁屏界面,众所周知,锁屏一般是跟屏幕的点亮和熄灭有关,所以我们可以监听系统的屏幕点亮、熄灭广播,来达到弹出我么自定义界面的目的。屏幕的点亮、熄灭广播必须动态注册,而我们由必须时刻监听这两个广播,所以最好的方式就是在常驻的service中监听这两个广播,关于如何创建常驻service,参考这篇文章 android-常驻service。广播创建如下:

final IntentFilter filter = new IntentFilter();  
        // 屏幕灭屏广播  
        filter.addAction(Intent.ACTION_SCREEN_OFF);  
        // 屏幕亮屏广播  
        filter.addAction(Intent.ACTION_SCREEN_ON);   
      
        BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() {  
            @Override  
            public void onReceive(final Context context, final Intent intent) {
                String action = intent.getAction(); 
                if (Intent.ACTION_SCREEN_ON.equals(action)) {  
         		Intent i = new Intent(context,ScreenActivity.class);
         		i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         		i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
         		context.startActivity(i);
                }
                if (Intent.ACTION_SCREEN_OFF.equals(action)) {  
                    Intent i = new Intent(context,ScreenActivity.class);
         	    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         	    i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
         	    context.startActivity(i);
                }	
            }
        };  
        registerReceiver(mBatInfoReceiver, filter);

这里还有一个问题,就是弹出多个activity的情况,目前我是自己定义了一个activity stack进行判断。此外还可以在activity配置那里修改启动方式为

android:launchMode="singleInstance"
这样也可以解决关闭锁屏后,呼出锁屏所在应用程序的问题。

你可能感兴趣的:(android,android开发,锁屏,android自定义锁屏,应用程序,屏蔽解锁界面)