Android 虚拟按键 Recent键屏蔽(隐藏)

最近做项目碰到一个需求,把那个Android 手机里面平板的虚拟 RecentApplication 键给隐藏掉,(我自己搞了好久,一直把他当成菜单键,看过源码的朋友就不要说了,O(∩_∩)O哈哈~)!

我在这里说下吧:

Android 4.0 桌面底部状态栏分为两个部分:左边是三个导航键:从左置右依次是:返回键 ,Home键和RecentApplication键,就是查看最近打开的所有程序,多任务切换就在这里。 这三个键为一个区域 叫NavigationArea,即导航区。 最右边是NotificationArea,也就是提示信息区,有电量,无线信号,蓝牙等信息显示。 这条StatusBar,是无论打开哪个程序都会显示在最下方的。
Home键与Recent键的点击事件是在framework层进行处理的,因此onKeyDown与dispatchKeyEvent都捕获不到点击事件。
查看StatusBarManager.java源码,目前只能通过其void disable(int what) {…}设置,并可传入值:

public static final int DISABLE_HOME = View.STATUS_BAR_DISABLE_HOME;    //二进制的值是0x00200000
public static final int DISABLE_RECENT = View.STATUS_BAR_DISABLE_RECENT;  //二进制的值是
0x01000000
public static final int DISABLE_BACK = View.STATUS_BAR_DISABLE_BACK;  //二进制的值是 0x00400000
public static final int DISABLE_NONE = 0x00000000;   

等等一些属性,具体的可以查看View的源码,因为都是@hide 的,Android中有许多隐藏的Service,StatusBarManager就是其中一个,在Context.java中可以看到:

**
/**
 * Use with {@link #getSystemService} to retrieve a {@link
 * android.app.StatusBarManager} for interacting with the status bar.
 *
 * @see #getSystemService
 * @see android.app.StatusBarManager
 * @hide
 */ 
public static final String STATUS_BAR_SERVICE = "statusbar";** 

表明该service不对外提供,如果要调用的话需要在源码树上编译,才能调用到标记为@hide的接口。也可以将源码编译出来的classes.jar包添加到工程里面。(这种方式我嫌麻烦)然后去网上找了下,可以利用反射来进行调用;
代码如下:

public static final String STATUS_BAR_SERVICE = "statusbar";
    public static final String CLASS_STATUS_BAR_MANAGER = "android.app.StatusBarManager";
    public static final String METHOD_DISABLE = "disable"; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        try {
            Object service = getSystemService(STATUS_BAR_SERVICE);
            Class statusBarManager = Class.forName(CLASS_STATUS_BAR_MANAGER);
            Method disable = statusBarManager.getMethod(METHOD_DISABLE,
                    int.class);
//          disable.invoke(service, 0x00200000); // 为View.STATUS_BAR_DISABLE_HOME 的值
//          disable.invoke(service, 0x00400000); // 为View.STATUS_BAR_DISABLE_BACK  的值
            disable.invoke(service, 0x01000000); // 为View.STATUS_BAR_DISABLE_RECENT的值
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

上面的“返回键”和“home”键我也这样加了进去,但效果不理想,只执行最后一条(谁放在后面最后执行谁),我后来把他们分开 也不行。但是需求没。

StatusBarManager提供了一些有用的接口,像disable()方法正是我们需要的,一些系统级的应用也是调用的该方法禁止StatusBar下拉的,比如电话、锁屏模块。想要调用该方法,你还需要以下权限:

<uses-permission android:name=”android.permission.EXPAND_STATUS_BAR”/>

会报出以下错误提示:
Neither user 10076 nor current process has android.permission.STATUS_BAR.
提示缺少权限,Manifest添加之,提示:Permission is only granted to system apps
通过这种方法屏蔽状态栏下拉,必须得有系统签名。

你可能感兴趣的:(【Android,进阶】)