您的位置:首页 > 移动开发 > Android开发

Android处理Home键方法小结

2015-04-19 21:35 148 查看
昨天需要处理一个问题,需要监听home键。最开始想到使用onKeydonwn这个方法。但是发现home不能这样处理,onKeydonwn可以处理菜单键和back键,但home不能。因为home键是系统键,情况特殊一些。在2.3版本以下重写下面方法就能重写home键public void onAttachedToWindow() {this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);super.onAttachedToWindow();}在4.0以上的版本中需要利用以下方法屏蔽和重写Home键,代码如下: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);}再重写onKey事件即可。@Overridepublic boolean onKeyDown( int keyCode, KeyEvent event) {// TODO Auto-generated method stubif (keyCode == event. KEYCODE_HOME) {return true;}return super.onKeyDown(keyCode, event);}PS:在AndroidMainfest.xml需要加权限:<uses-permission android:name = "android.permission.DISABLE_KEYGUARD"/><!-- 屏蔽HOME键需要的权限 -->在配置文件中,在你使用了Notification的activity中加一个属性android: android:launchMode="singleInstance"看了一下网上的资料,说下面的方法可以。(其实不行)Java代码 :
1
*
<a href=
"http://home.51cto.com/index.php?s=/space/5017954"
target=
"_blank"
>
@Override
</a>
2
*
public
3
void
onAttachedToWindow(){
4
*
//TODO Auto-generated method stub
5
*Log.d(
"aeon"
,
"onAttachedToWindow"
);
6
*
this
.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
7
*
super
.onAttachedToWindow();
8
*}  
加了权限之后也不行。Xml代码
1
#<
uses-permission
2
android:name
=
"android.permission.DISABLE_KEYGUARD"
3
>
4
#</
uses-permission
>
实验几次之后(android4.1 和android4.2)发现在单个的activity里面有以下几个方法可以使用:方法1:onSaveInstanceState方法下面这个方法可以处理home的监听问题。Java代码
1
protected
2
void
onSaveInstanceState(BundleoutState)  
但这个方法不是很好,不推荐方法2:onUserLeaveHint方法Java代码
1
*
<a href=
"http://home.51cto.com/index.php?s=/space/5017954"
target=
"_blank"
>
@Override
</a>
2
*
protected
3
void
onUserLeaveHint(){
4
*Log.d(
"aeon"
,
"onUserLeaveHint"
);
5
*
super
.onUserLeaveHint();
6
*}  
这个方法会在onSaveInstanceState之前执行,根据api的解释,这个方法还比较合适的。方法3:ACTION_CLOSE_SYSTEM_DIALOGS在使用广播监听方面可以使用ACTION_CLOSE_SYSTEM_DIALOGSJava代码
1
*
//注册Receiver
2
*
3
4
*HomeKeyEventBroadCastReceiver receiver = 
new
HomeKeyEventBroadCastReceiver();
5
*registerReceiver(receiver, 
new
IntentFilter(
6
*Intent. ACTION_CLOSE_SYSTEM_DIALOGS)); 
方法4:framework PhoneWindowManager.java 处理想要完全监听home键需要在framework层去处理。/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java里面去修改private void handleLongPressOnHome() 这个方法。Java代码
01
*
private
02
void
handleLongPressOnHome(){
03
*
//We can't initialize this in init() since the configuration hasn't been loaded yet.
04
*
if
(mLongPressOnHomeBehavior< 
0
){
05
*mLongPressOnHomeBehavior  
06
*= mContext.getResources().getInteger(R.integer.config_longPressOnHomeBehavior);
07
*
if
(mLongPressOnHomeBehavior< LONG_PRESS_HOME_NOTHING ||  
08
*mLongPressOnHomeBehavior > LONG_PRESS_HOME_RECENT_SYSTEM_UI) {
09
*mLongPressOnHomeBehavior = LONG_PRESS_HOME_NOTHING;
10
*}  
11
*}  
12
*
13
14
*
if
(mLongPressOnHomeBehavior!= LONG_PRESS_HOME_NOTHING) {
15
*performHapticFeedbackLw(
null
,HapticFeedbackConstants.LONG_PRESS, 
false
);
16
*sendCloseSystemWindows(SYSTEM_DIALOG_REASON_RECENT_APPS);
17
*
18
19
*
//Eat the longpress so it won't dismiss the recent apps dialog when
20
*
//the user lets go of the home key
21
*mHomeLongPressed = 
true
;
22
*}  
23
*
24
25
*
if
(mLongPressOnHomeBehavior== LONG_PRESS_HOME_RECENT_DIALOG) {
26
*showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS);
27
*} 
else
28
if
(mLongPressOnHomeBehavior== LONG_PRESS_HOME_RECENT_SYSTEM_UI) {
29
*
try
{
30
*IStatusBarService statusbar = getStatusBarService();
31
*
if
(statusbar!= 
null
){
32
*statusbar.toggleRecentApps();
33
*}  
34
*} 
catch
(RemoteExceptione) {
35
*Slog.e(TAG, 
"RemoteExceptionwhen showing recent apps"
,e);
36
*
//re-acquire status bar service next time it is needed.
37
*mStatusBarService = 
null
;
38
*}  
39
*}  
40
*}  
只要把handleLongPressOnHome里面做出相对应的处理就ok
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: