android4.0自定义锁屏apk形式总结
来源:互联网 发布:java服务器类型 编辑:程序博客网 时间:2024/06/10 23:55
好了,言归正传,说说锁屏了,其实把锁屏做成apk的形式,会引起很多问题的,导致不必要的麻烦,就像市场上的流行的Go锁屏和91锁屏也是会有一些问题的,只是影响不大,最好的做法是修改源码,在源码中定制自己的锁屏,这样一劳永逸;
首先做锁屏考虑的事有以下四点;
(1)替换掉系统的锁屏,不能让系统的锁屏显示出来;
(2)屏蔽掉Home键盘,back键,menu键;
(3)在其他界面或Launcher界面,长按home键,不能让自己的锁屏apk显示在最近任务中;
(4)每次开机显示自己的锁屏
针对这四点一一做解答,不一定是完整的代码,只是提供以下思路,有兴趣的同学可以提出疑问;
针对(1),这个比较容易,就调用disableKeyguard掉系统的就可以了;
针对(2),这个Home键的处理,我看网上有同学写博客了,有同学这么处理:
[java] view plaincopyprint?
原理:是把这个view当成系统的错误的view,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 中,只需要添加该标志就可以了
getWindow().addFlags(WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED);
如果要使home 键有效,再 clearFlags 即可。
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED);
注意:以上代码要加在setContentView()之前才行;
这个代码来源于PhoneWindowManager.java这个类,
[html] view plaincopyprint?
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掉系统的锁屏,然后启动自己的锁屏的服务,监听屏幕亮和灭的广播,这个屏幕亮和灭的广播要动态监听;大家有好的思路可以留言讨论?
首先做锁屏考虑的事有以下四点;
(1)替换掉系统的锁屏,不能让系统的锁屏显示出来;
(2)屏蔽掉Home键盘,back键,menu键;
(3)在其他界面或Launcher界面,长按home键,不能让自己的锁屏apk显示在最近任务中;
(4)每次开机显示自己的锁屏
针对这四点一一做解答,不一定是完整的代码,只是提供以下思路,有兴趣的同学可以提出疑问;
针对(1),这个比较容易,就调用disableKeyguard掉系统的就可以了;
1
2
3
4
5
6
[java] view plaincopyprint?
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键的处理,我看网上有同学写博客了,有同学这么处理:
[java] view plaincopyprint?
原理:是把这个view当成系统的错误的view,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;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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;
}
}
在app 的你要屏蔽home 键的activity 中,只需要添加该标志就可以了
getWindow().addFlags(WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED);
如果要使home 键有效,再 clearFlags 即可。
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED);
注意:以上代码要加在setContentView()之前才行;
这个代码来源于PhoneWindowManager.java这个类,
[html] view plaincopyprint?
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自定义锁屏apk形式总结
- android4.0自定义锁屏apk形式总结
- android4.0自定义锁屏apk形式总结
- android4.0自定义锁屏总结 Home button disable in Android4.0.3 应用层解决Home button disable的问题
- android4.0自定义锁屏总结【android锁屏研究一】
- android4.0自定义锁屏总结【android锁屏研究一】
- android4.0自定义锁屏总结【android锁屏研究一】
- android4.0自定义锁屏总结【android锁屏研究一】
- Android4.0上合并apk和odex
- android4.0修改launch的屏数和默认显示屏及添加apk包的快捷方式
- android4.0代码下载总结
- android4.0蓝牙不能传输apk的解决方法
- android4.0去掉锁屏和休眠
- 关于android4.0 cts的一些总结
- android4.0开发环境本地搭建--总结
- Android4.0设置界面修改总结
- Android4.0设置界面修改总结
- Android4.0设置界面修改总结
- 关于 if(类对象) 语法的研究
- 服务器发布tomcat的WEB项目供外网访问
- Error Parsing XML: unbound prefix--关于Android中的xliff
- SecureCRT和Xmanager解决向上、向下跳回已经执行过得sql
- AIX_时间同步配置
- android4.0自定义锁屏apk形式总结
- 匀速贝塞尔曲线运动的实现(转)
- android 如何判定是否首次使用
- hdu-3784-继续XXX定律
- 零基础linux汇编视频(大灰狼)
- sqlite ORM(automatic database operation)
- IE 升级之后 打不开 [转]
- Mysql 卸载后,重新安装失败问题解决方法
- Programming Principles