android-自定义锁屏界面

来源:互联网 发布:全站程序员 编辑:程序博客网 时间:2024/06/07 00:43

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

一、屏蔽系统锁屏

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

<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

其次是在我们自定义的锁屏界面操作系统锁屏,这部分有两种方法。第一种是使用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"
这样也可以解决关闭锁屏后,呼出锁屏所在应用程序的问题。

0 0
原创粉丝点击