android 4.0 屏蔽 HOME_KEY 和 RECENT_APP_KEY

Posted smile3670

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 4.0 屏蔽 HOME_KEY 和 RECENT_APP_KEY相关的知识,希望对你有一定的参考价值。

在项目中需要屏蔽虚拟按键,back 和menu键可以屏蔽,但是HOME_KEY 和 RECENT_APP_KEY 却无法屏蔽,在 onKeyDown(int keyCode, KeyEvent event) 方法中不能捕获HOME_KEY 和 RECENT_APP_KEY 的动作。

1、屏蔽HOME_KEY

参考网站http://www.2cto.com/kf/201207/138886.html

在/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java(拦截消息的处理类) 

的interceptKeyBeforeDispatching() 方法中做修改

public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000;
// If a system window has focus, then it doesn't make sense
            // right now to interact with applications.
            WindowManager.LayoutParams attrs = win != null ? win.getAttrs() : null;
            if (attrs != null) 
                final int type = attrs.type;
                if (type == WindowManager.LayoutParams.TYPE_KEYGUARD
                        || type == WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG) 
                    // the "app" is keyguard, so give it the key
                    return 0;
                
                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 app
                    	return -1;
                    
                
                
		//以下条件屏蔽HOMEKEY
                final int flag = attrs.flags;
                if ((flag & FLAG_HOMEKEY_DISPATCHED) != 0)
                	Log.i(TAG, "============ FLAG_HOMEKEY_DISPATCHED");
                	return 0;
                
            

在应用中设置以下代码

public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000;
public void onAttachedToWindow() 
		getWindow().addFlags(FLAG_HOMEKEY_DISPATCHED);
		super.onAttachedToWindow();

并在onKeyDown(int keyCode, KeyEvent event) 中返回true。屏蔽了HOME键

2、屏蔽RECENT_APP_KEY

PhoneWindowManager.java(拦截消息的处理类) 的interceptKeyBeforeDispatching() 方法中,RECENT_APP_KEY的事件不能截取。屏蔽RECENT_APP_KEY只能另想办法。

参考http://blog.csdn.net/yihongyuelan/article/details/7623578

在/frameworks/base/packages/SystemUI 中的TabletStatusBar.java (平板的StatusBar)。发现在类中存在一个广播类,添加一个屏蔽的动作和一个取消屏蔽的动作。达到通过广播去控制recentApp的动作是否响应。

protected View makeStatusBarView() 
	...
	...
	// receive broadcasts
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
	//增加开关动作
        filter.addAction(ACTION_DISABLE_RECENT_BUTTON);
        filter.addAction(ACTION_ENABLE_RECENT_BUTTON);
        context.registerReceiver(mBroadcastReceiver, filter);

        return sb;

    private boolean disableRecentButton = false;
    private static final String ACTION_DISABLE_RECENT_BUTTON = "action_disable_recent_button";
    private static final String ACTION_ENABLE_RECENT_BUTTON = "action_enable_recent_button";
    
    private View.OnClickListener mOnClickListener = new View.OnClickListener() 
        public void onClick(View v) 
            if (v == mRecentButton) 
            	if (!disableRecentButton) 
			//recentApp 动作处理
            		onClickRecentButton();
				
             else if (v == mInputMethodSwitchButton) 
                onClickInputMethodSwitchButton();
             else if (v == mCompatModeButton) 
                onClickCompatModeButton();
            
        
;


private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() 
        public void onReceive(Context context, Intent intent) 
            String action = intent.getAction();
            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)
                || Intent.ACTION_SCREEN_OFF.equals(action)) 
                boolean excludeRecents = false;
                if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) 
                    String reason = intent.getStringExtra("reason");
                    if (reason != null) 
                        excludeRecents = reason.equals("recentapps");
                    
                
                if (Intent.ACTION_SCREEN_OFF.equals(action)) 
                    // If we're turning the screen off, we want to hide the
                    // recents panel with no animation
                    // TODO: hide other things, like the notification tray,
                    // with no animation as well
                    mRecentsPanel.show(false, false);
                    excludeRecents = true;
                
                animateCollapse(excludeRecents);
             
		//增加开关动作
	    else if (ACTION_DISABLE_RECENT_BUTTON.equals(action))
            	disableRecentButton = true;
             else if (ACTION_ENABLE_RECENT_BUTTON.equals(action))
            	disableRecentButton = false;
            
        
    ;

最后在应用中添加以下代码就可以屏蔽了RECNET_APP_KEY

private static final String ACTION_DISABLE_RECENT_BUTTON = "action_disable_recent_button";
    private static final String ACTION_ENABLE_RECENT_BUTTON = "action_enable_recent_button";
	
	@Override
	protected void onResume() 
		super.onResume();
		Intent intent = new Intent(ACTION_DISABLE_RECENT_BUTTON);
		sendBroadcast(intent);
	

	@Override
	protected void onPause() 
		Intent intent = new Intent(ACTION_ENABLE_RECENT_BUTTON);
		sendBroadcast(intent);
		super.onPause();
	


以上是关于android 4.0 屏蔽 HOME_KEY 和 RECENT_APP_KEY的主要内容,如果未能解决你的问题,请参考以下文章

搭载Android 4.0是啥意思 和安卓4.0操作系统 有啥区别

Android 2.3 和 Android 4.0 上的联系人照片 uri

调整 Chrome 地址栏屏蔽的大小问题 (Android)

android源码中在framework层如何修改代码屏蔽掉home按键

Android如何屏蔽home键和recent键

Android低功耗蓝牙(蓝牙4.0)——BLE开发(上)