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。
- Android学习 - 自定义锁屏基本原理
- 自定义锁屏demo之基本原理
- Android自定义控件之基本原理
- Android自定义控件之基本原理
- Android中自定义Adapter的基本原理
- Android中自定义Adapter的基本原理
- Android中ContentProvider的基本原理学习总结
- Android API 学习日记----《应用程序的基本原理》
- Android自定义控件之基本原理 转载自(总李写代码)
- Base64 基本原理及自定义
- Android学习 - 自定义锁屏demo之滑动解锁
- Android官网学习笔记002:应用程序基本原理(01)
- Android官网学习笔记003:应用程序基本原理(02)
- Android官网学习笔记004:应用程序基本原理(03)
- android 自定义锁屏
- Android自定义锁屏
- android 自定义锁屏
- android 自定义锁屏
- 15/4/23
- MySQL性能优化的最佳20+条经验
- fork两次如何避免僵尸进程收藏
- Yammer 从 Scala 转向 Java 使用技巧及问题
- C语言实现2路归并排序
- Android学习 - 自定义锁屏基本原理
- The first experience of any type of regression
- 开源中国Maven库笔记
- MVC4 WEB程序项目执行流程
- 松德股份的莎莎程序吃速度发的
- ASP.NET中DropDownList控件的简单使用--DDL绑定数据库表中值,选择DDL中值直接检索数据
- Android多任务切换与Activity启动模式SingleTask之间关系的分析
- C#winform 实现图片轮播
- 尾调用优化