android4.0自定义锁屏总结【android锁屏研究一】
最近搬家了,从北京--->深圳,除了天气有点不同外,其他的都差不多,工作性质和以前也类似!纪念一下自己的迁移。
-----题外话
转载请表明出处:http://blog.csdn.net/wdaming1986/article/details/8837023
好了,言归正传,说说锁屏了,其实把锁屏做成apk的形式,会引起很多问题的,导致不必要的麻烦,就像市场上的流行的Go锁屏和91锁屏也是会有一些问题的,只是影响不大,最好的做法是修改源码,在源码中定制自己的锁屏,这样一劳永逸;
首先做锁屏考虑的事有以下四点;
(1)替换掉系统的锁屏,不能让系统的锁屏显示出来;
(2)屏蔽掉Home键盘,back键,menu键;
(3)在其他界面或Launcher界面,长按home键,不能让自己的锁屏apk显示在最近任务中;
(4)每次开机显示自己的锁屏
针对这四点一一做解答,不一定是完整的代码,只是提供以下思路,有兴趣的同学可以提出疑问;
针对(1),这个比较容易,就调用disableKeyguard掉系统的就可以了;
mKeyguardManager = (KeyguardManager)Class.this.getSystemService(Context.KEYGUARD_SERVICE);mKeyguardLock = mKeyguardManager.newKeyguardLock("my_lockscreen"); mKeyguardLock.disableKeyguard();
注意:在Manifext.xml中加入权限:
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
针对(2),这个Home键的处理,我看网上有同学写博客了,有同学这么处理:
public class LockLayer { private Activity mActivty; private WindowManager mWindowManager; private View mLockView; private LayoutParams mLockViewLayoutParams; private static LockLayer mLockLayer; private boolean isLocked; public static synchronized LockLayer getInstance(Activity act){ if(mLockLayer == null){ mLockLayer = new LockLayer(act); } return mLockLayer; } private LockLayer(Activity act) { mActivty = act; init(); } private void init(){ isLocked = false; mWindowManager = mActivty.getWindowManager(); mLockViewLayoutParams = new LayoutParams(); mLockViewLayoutParams.width = LayoutParams.MATCH_PARENT; mLockViewLayoutParams.height = LayoutParams.MATCH_PARENT; //实现关键 mLockViewLayoutParams.type = LayoutParams.TYPE_SYSTEM_ERROR; //apktool value,这个值具体是哪个变量还请网友帮忙 mLockViewLayoutParams.flags = 1280; } public synchronized void lock() { if(mLockView!=null&&!isLocked){ mWindowManager.addView(mLockView, mLockViewLayoutParams); } isLocked = true; } public synchronized void unlock() { if(mWindowManager!=null&&isLocked){ mWindowManager.removeView(mLockView); } isLocked = false; } public synchronized void setLockView(View v){ mLockView = v; }
}
原理:是把这个view当成系统的错误的view,
这个在PhoneWindowManager.java中的interceptKeyBeforeDispatching()方法中也有根据,请看真相:
final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length;for (int i=0; i<typeCount; i++) {if (type == WINDOW_TYPES_WHERE_HOME_DOESNT_WORK[i]) {// don't do anything, but also don't pass it to the appreturn -1;}}
看注释:如果设置了这两个属性的其中一个,就不做任何处理,home键不对这个app生效;
而WINDOW_TYPES_WHERE_HOME_DOESNT_WORK数据的定义如下:
private static final int[] WINDOW_TYPES_WHERE_HOME_DOESNT_WORK = {WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,};
这下你就明白为什么上述代码设置为TYPE_SYSTEM_ERROR,其实设置为TYPE_SYSTEM_ALERT也可以的。
再来看看sdk文档有解释说明,
Window type: internal system error windows, appear on top of everything they can. In multiuser systems shows only on the owning user's window.
这个error的view在所有的view的最上面,所以就可以达到屏蔽home键的效果了;
问题来了:在这个界面长按power键,关机界面也弹不出来了,这个我试验过,所以这个方法不可取;
还有同学说这么做:
private static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000;
在app 的你要屏蔽home 键的activity 中,只需要添加该标志就可以了this.getWindow().setFlags(FLAG_HOMEKEY_DISPATCHED, FLAG_HOMEKEY_DISPATCHED);如果要使home 键有效,再 clearFlags 即可。getWindow().clearFlags(WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED);
注意:以上代码要加在setContentView()之前才行;
这个代码来源于PhoneWindowManager.java这个类的interceptKeyBeforeDispatching()方法中,
if ((flag & WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED) != 0) {// the window wants to handle the home key, so dispatch it to it.return 0;}
这样设置,有的同学感觉好用,有的同学感觉不好用;
原因:android4.0的源码的PhoneWindowManager.java没有添加上述代码,所以不起作用,
而4.1的源码PhoneWindowManager.java中有这个代码,所以好用,这个请大家看看对应的源码是否有上述代码;
针对(3),这个就模仿Go锁屏和91锁屏,在启动锁屏的activity中配置
<category android:name="android.intent.category.HOME" />
这个属性,然后先清除系统启动的默认设置,就是选择系统点击Home键启动哪个home,设置为启动自己的锁屏,然后再设置解锁后启动那个桌面,这个自己处理下逻辑就可以了,大致思路就是这个样子的;
针对(4),这个Go锁屏还有91锁屏处理的都不太理想,回头我想到好的思路再更新,大致思路是:监听开机广播,<action android:name="android.intent.action.BOOT_COMPLETED"/>,这个写一个MYBootCompletedReceiver类,作用是disable掉系统的锁屏,然后启动自己的锁屏的服务,监听屏幕亮和灭的广播,这个屏幕亮和灭的广播要动态监听;大家有好的思路或见解可以留言讨论?
做一个激情四射的程序员!
android4.0自定义锁屏总结【android锁屏研究一】相关推荐
- linux 锁屏 代码,Android锁屏与解屏相关代码分析
我觉得对于普通人来说,最常见的是Android解屏的界面,然后应该是Home界面.今天就来分析一下解屏界面的相关代码(以索爱的解锁界面为例). 首先看解屏的界面,我把解屏的界面分为两个部分,最上部是s ...
- android4.0 去掉虚拟按键 教程,Android 4.0 隐藏虚拟按键(导航栏)的方法
在Android4.0里,多了一些API,其中包括怎样隐藏虚拟按键(导航栏),这样编写游戏或一个视频播放器时,可以设置隐藏虚拟按键的参数,达到最佳效果,当然前提是使用的手机是有虚拟按键的,如下图所示下 ...
- android开发截屏代码,android截屏代码:C++实现
android截屏代码:C++实现 示例代码在: frameworks\base\services\surfaceflinger\tests\screencap\screencap.cpp /* * ...
- android 手机录屏功能,Android录屏功能的实现
最近做一个Android开发的项目用到了录屏的功能,开始查阅了一些资料和博客,基本上都是在讨论ROOT的.直到后来在github上看到一个比较新的代码,才恍然发现,Android 5.0时候开放了一个 ...
- android的横竖屏切换,Android横竖屏切换 初步探究
当手机横竖屏切换的时候,activity,默认会重新走一遍生命周期,即销毁当前,然后重新创建 首先,很多软件在设计和开发中为了避免横竖屏切换时引发不必要的麻烦,通常需要让App禁止掉横竖屏的切换,这就 ...
- android骨架屏框架,Android 骨架屏效果,了解一下
原标题:Android 骨架屏效果,了解一下 以前做应用开发时,在数据尚未加载前一般会先给用户一个提示,最简单粗暴的方式就是菊花图,大多数做法是放一张有个性的静态图,示意正在加载数据,这样体验会好些, ...
- android 锁屏音量,Android锁屏状态获取音量按键事件
Android系统没有提供音量按键的广播,而Activity的onKeyDown方法只有在界面显示时才能捕获音量变化, 要在锁屏状态或后台获得音量按键事件,可以通过判断音量值的改变来判断是否按下了音量 ...
- android 锁屏 home,android 锁屏界面禁用长按home 和menu(recent apps)
android 5.1 系统中 public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int polic ...
- android 自动亮屏解锁,android锁屏唤醒并解锁屏幕
1.这个方法是实现锁屏状态下唤醒手机,亮屏并解锁屏幕:public static void wakeUpAndUnlock(Context context){ //屏锁管理器 KeyguardMana ...
最新文章
- jquery将html转为pdf文件,通过Jquery将HTML Div转换为PDF
- 随机森林RF中的特征重要性的计算公式VIM
- Java网络编程笔记2
- Unity 高清渲染管线 ShaderGraph 实现简单的表面水流效果
- C++ 基础 : 函数重载、引用、内联函数、auto、范围for循环
- opencv第三方库JAVA接口,SpringBoot使用OpenCV示例总结
- Android之解决webview加载第三方网页点击弹不出下拉框(html页面里面的select标签)
- linux不适合数据传输,【Linux调试经验】局域网内数据传输不经过路由
- flask-前端-requests之response对应关系 text
- pythonwhile循环怎么修改数据类型_分级程序有while循环问题,使用不同的数据类型...
- oracle中查找某用户执行某张表的操作操作记录
- PHP User Agent
- 看拉扎维《模拟CMOS集成电路设计》的一些总结和思考(三)——单级放大器
- 打印图片一直显示连接传真服务器,打印机打印时显示传真怎么办
- 上海大学计算机考证时间表
- 《MINECRAFT我的世界 新手完全攻略(第3版)》一1.3 开始新游戏
- ElectronBot支线项目
- 《LeetCode刷题》—121. 买卖股票的最佳时机
- 100万量子比特,PsiQuantum要怎样实现?
- 蓝牙hid协议源码解析