`

Android锁屏页实现原理及技术要点

 
阅读更多

转自: http://blog.csdn.net/ahence/article/details/25400911

这两天在搞一个锁屏的小玩意儿,由于时间比较紧,先着重于功能实现,未能从源代码上分析,以下是一些个人的认识与总结,不足或错误之处,还请各位看官批评指正。

1.锁屏页的本质:

        锁屏界面其实也是一个Activity,只不过在该Activity上,屏蔽了Home键及Back键的响应,只有当用户解锁的时候才可以进入下一个界面,一般是Launcher界面。当然用户解锁的方式可以是滑动解锁,可以是密码解锁,完全在于自己对该锁屏界面的设计,同样可以像市场上很多锁屏软件一样,可以加入一些有用的小玩意儿,比如天气预报、时钟、新闻等,因为这就是一个Activity,就像平时我们设计界面内容一样,理论上可以随意设计,当然也要符合锁屏页的原则,尽量简洁美观易用。

2.实现原理

        理论上有两种实现方式,一种是定制源代码;另一种就是在应用层开发一个锁屏程序。除非特别需要,一般我们都是自己开发一个锁屏程序。

        如果自己开发一个锁屏程序,一般是这样做的:

(1)系统在按下电源键关闭屏幕或点亮屏幕时会发出相应的广播,如Intent.ACTION_SCREEN_OFF和Intent.ACTION_SCREEN_ON,所以我们就可以注册一个BroadcastReceiver来接收这些广播,应当注意这些广播都是受保护的,是由系统负责发送的。

(2)当接收到这些广播消息,我们就可以启动锁屏页Activity,这样就显示出锁屏界面效果了。

(3)在锁屏页上进行解锁,然后finish掉该锁屏界面,实现解锁效果。这里的要点和难点是屏蔽掉Home键和Back键,下面技术要点里会讲。

3.技术要点

(1)屏蔽Back

        Back键比较容易屏蔽掉,重写onKeyDownonBackPressed方法即可,几乎在所有Android版本上都是可以用的(并未亲自测试所有版本,测了几个版本并未遇到无效的情况)。

(2)屏蔽Home

        再来说屏蔽Home键,这个算是一个难点了。其实可以试想一下,如果运行了一个APP,当Back键和Home键被屏蔽掉,那么这个程序是无法退出的,如果再是一个流氓软件,这是多么恶心的用户体验啊!除非你是一个很正规的锁屏软件,否则不建议屏蔽掉Home键。

        Android4.0版本之前还是可以找到方法屏蔽Home键的,但是4.0之后则不再允许屏蔽Home键了,或许Google也是从安全性和用户体验的角度考虑,Home键的响应直接在FrameWork层就处理了,而不会再传到application层来处理。当然网上也看到有方法侦听到Home键,但是监听归监听,但你无法屏蔽它。也就是说4.0之后,当按下Home键时,系统默认会响应启动Home页,也就是Launcher桌面,我们在应用层没有办法再屏蔽它。当然你可以修改FrameWork层代码,重新定制,这属于第一种实现方式了,不在此文的探讨范围。

        下面该是具体实现了:

(2-1) Android 2.2-3.2版本(测试版本2.3.3

A.重写以下两个方法

@Override  

public boolean onKeyDown(int keyCode, KeyEvent event) {  

    if(KeyEvent.KEYCODE_HOME==keyCode){  

        return true;  

    }  

    return super.onKeyDown(keyCode, event);  

}  

@Override  

 public void onAttachedToWindow(){  

    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);  

    super.onAttachedToWindow();  

 }  

B.加入对应权限

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

(2-2)Android4.0版本

        在网上看到如下实现方法:

A.public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000; 

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        this.getWindow().setFlags(FLAG_HOMEKEY_DISPATCHED, FLAG_HOMEKEY_DISPATCHED);  

       setContentView(R.layout.main);

    }

B.然后再重写onKey事件。

        经测试,4.0.4版本可以,4.2.2无效,因此这种方式不能解决4.0+系统屏蔽Home键的根本问题。

        鉴于上面所述,在Android4.0+Application层已无法屏蔽Home键,因此只能另想它法。测试了百度锁屏及Go锁屏两款锁屏软件,这两款软件都让用户进行Home设置,避免点击Home键取消锁屏。所谓进行Home设置,其实质就是将该锁屏软件设置为默认的桌面启动页,即Launcher启动桌面,很明显,因为无法屏蔽Home键,我们只能追随它,点击Home启动Launcher,只不过是把Launcher设为我们自己的锁屏App中的一个Activity而已了(其实这里是有技巧的,我开始也理解错了,且看下文)。

 

        把玩了一会儿百度锁屏及Go锁屏软件,果断把自己的锁屏页设为Home页,设置方法如下:

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.HOME" />      

<category android:name="android.intent.category.DEFAULT" />

        然后测试,把锁屏页设为默认Launcher,这时候按下Home键果然就停在锁屏页了,因为此时点Home键本该启动Home页面,而此时我们的锁屏页就是Home页。本以为这样就可以了,但当你解锁后,在其他界面,比如短信界面按下Home键,我们希望回到某个桌面主页(比如系统桌面主页),但是此时却会回到我们锁屏页,因为前面我们把锁屏页设置为默认桌面主页了,而百度锁屏和Go锁屏在点击短信界面的Home时却不会回到锁屏页,而是回到系统主页(这里是可以在百度锁屏里设置的,如果有多个桌面启动Launcher,可以选择)。

    于是猜测可能是锁屏时把锁屏页设为桌面主页,解锁后重新设置了一个桌面主页,于是用百度锁屏解锁后,在应用程序查看,桌面主页依然是锁屏程序而不是在设置里选择的那个桌面启动Launcher开始有点困惑了,没想通,果断把百度锁屏apk Dec一把,打开其配置文件一看,顿时恍然,也瞬间明白了进行Home键设置时为什么要选择一个解锁后的桌面启动页。

        在百度锁屏里,原来锁屏页与设置为桌面启动页的是不同的两个Activity,为了行文方便,姑且记锁屏页为A,记桌面启动页为B。锁屏应用启动后,进行Home设置,实质是将B设置为默认桌面启动页,这里注意的是BthemeTheme.NoDisplay。关闭屏幕再开启,百度锁屏启动了,点击Home,实质上是启动了B,而B是不可见的,因此不会影响下面的A的操作,然后解锁,显示系统桌面(我在设置里选择了系统桌面),如果再到短信界面按下Home键,其实是启动了B,只是看起来没有反应而已,也不会影响操作,也就不会回到锁屏页了,因为锁屏页A不是桌面页。只有在ScreenOnScreenOff时才会启动锁屏。

        再来说前边为什么要我们选择一个解锁后的桌面页,是因为百度锁屏解锁后,会跳到该桌面页,当然我们可以直接使用系统桌面,不用在配置里选择,这样解锁后就跳到系统桌面了。

        究其原因,因为自己的小程序只有一个锁屏Activity,就想当然把它设为桌面启动页,因此不能实现百度锁屏的效果;最后自己也另加一个Activity,不过我是使用了一个透明的Activity,并在启动后把它移到后台;在解锁后,默认启动系统桌面,这样就可以完美实现类似百度锁屏的禁用Home键的效果了。原理搞清楚了,实现方法就殊途同归了。

        先总结到这里,该去看看这一块儿的源码了。

分享到:
评论

相关推荐

    android 自定义锁屏实现原理

    Android 自定义锁屏实现原理 Android 自定义锁屏是指在 Android 系统中,开发者可以根据自己的需求,设计和实现一个自定义的锁屏界面,以满足不同的应用场景。下面是 Android 自定义锁屏的实现原理。 锁屏服务的...

    android一键锁屏实现原理

    以上就是关于“android一键锁屏实现原理”的详细解释,通过理解设备管理器的机制和权限控制,开发者可以为用户提供便捷的设备管理功能。在实际项目中,可以根据需求扩展和优化这个过程,例如添加动画效果、自定义...

    Android框架浅析之锁屏(Keyguard)机制原理

    ### Android框架浅析之锁屏(Keyguard)机制原理 #### 一、锁屏界面的组成 锁屏(Keyguard)是Android系统中的一个重要组成部分,它主要用于保护用户的隐私数据不被未授权访问。锁屏功能主要由两个部分组成:解锁...

    Android自定义锁屏页Demo

    本项目“Android自定义锁屏页Demo”旨在帮助开发者理解和实现这一功能。下面我们将详细探讨Android自定义锁屏页的核心知识点以及如何通过这个Demo进行实践。 1. **Activity与Window** 自定义锁屏页面本质上是创建...

    android锁屏界面显示,仿播放器。

    首先,理解Android锁屏界面的工作原理至关重要。Android系统允许开发者通过服务(Service)和广播接收器(BroadcastReceiver)来监听和控制锁屏状态。在我们的案例中,我们需要创建一个媒体服务,负责播放音频或视频...

    Android 10.0 锁屏讲解

    在Android系统中,锁屏是用户与设备交互的重要部分,特别是在保护隐私和设备安全方面起着关键作用。本文将深入探讨Android 10.0版本的锁屏启动流程,包括锁屏的启动、灭屏上锁以及亮屏解锁的逻辑。这对于SystemUI的...

    Android锁屏状态下显示Activity

    在Android中,为了实现锁屏状态下显示Activity,首先需要处理的是电源管理。应用需要获取到相应的唤醒权限,以确保在锁屏时能够唤醒设备。在AndroidManifest.xml中添加以下权限: ```xml &lt;uses-permission ...

    Android 锁屏页面避免被杀掉,解锁会自动关闭页面。防止后台运行时被关闭。

    在Android开发中,保持应用程序在锁屏状态下不被系统优化机制清理,并且在用户解锁后能够自动关闭特定页面,是一项常见的需求。这涉及到Android系统的进程管理、权限控制以及活动生命周期管理等多个方面。以下是对这...

    解决Android锁屏无法继续定位问题

    解决Android锁屏无法继续定位的问题,我在启动定位的时候提示了一个通知,通知的主要功能就是告诉启动了定位。锁屏后通知不会提示!!!在启动定位了之后,往本地写了一个txt文件, txt文件显示的是 “时间、经纬度...

    android锁屏源码

    本文将深入探讨"android锁屏源码"的相关知识点,以帮助开发者理解其工作原理并进行定制。 一、Android锁屏机制概述 Android锁屏分为多种类型,如图案解锁、PIN码解锁、密码解锁等。这些解锁方式的实现基于Android...

    Android自定义锁屏实现----仿正点闹钟滑屏解锁

    在Android开发中,自定义锁屏界面是一种常见的需求,它能...在实践中,你可能会遇到各种挑战,但只要熟悉Android开发的基本原理和技术,就能够逐步解决这些问题。记得,不断学习和实践是提高Android开发技能的关键。

    Android锁屏简易Demo

    本项目“Android锁屏简易Demo”提供了一个基础框架,帮助开发者了解如何实现一个基本的锁屏功能。这个小Demo允许用户设置左滑解锁和右滑解锁,类似于一些定制的智能锁屏界面。 首先,我们需要理解Android系统的活动...

    android 悬浮窗全屏显示,锁屏页面悬浮窗全屏显示

    在Android开发中,实现一个能够全屏显示并覆盖导航栏和状态栏的悬浮窗,以及在锁屏页面依然保持全屏显示,是一项涉及到系统权限、窗口管理服务和自定义视图的技术挑战。以下是对这个主题的详细解释: 1. **悬浮窗...

    解决Android锁屏无法继续定位问题-最新

    解决Android锁屏无法继续定位的问题,我在启动定位的时候提示了吐司,如果返回定位会显示"启动定位"四个字。在启动定位了之后,往本地写了一个txt文件, txt文件显示的是 “时间、经纬度”等一些信息。可查看确认...

    Android锁屏无法继续定位问题

    Android锁屏无法继续定位问题 产生问题的原因: 手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会将手机进入休眠状态。此时的服务以及线程等都会停止。 最近就这个问题,阅读了很多代码以及官方文档...

    Android锁屏

    本教程将深入探讨如何在Android中实现自启动的锁屏以及屏蔽系统默认锁屏功能。 一、Android锁屏机制 Android锁屏的基本功能包括密码锁、图案锁、指纹锁等,它们都是通过Android的安全框架实现的。安全框架提供了...

    Android实现锁屏、设置密码、恢复出厂设置示例

    在Android平台上,为设备添加锁屏、设置密码以及执行恢复出厂设置等功能,是开发者们经常遇到的任务,尤其对于系统级应用或安全管理类应用而言更是必不可少。这个示例将引导我们了解如何利用Android的API和权限管理...

    Android实现动态锁屏功能实现

    Android锁屏实现动态锁屏功能效果实现

    Android锁屏应用源码

    通过学习和分析"Lock_QinZDLock"源码,开发者不仅可以了解如何实现一个基础的Android锁屏应用,还能深入理解Android系统的服务、广播接收器、触摸事件处理等关键概念,为后续的Android开发奠定坚实的基础。

Global site tag (gtag.js) - Google Analytics