最近做項目碰到一個需求,把那個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中可以看到:
**
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下拉的,比如電話、鎖屏子產品。想要調用該方法,你還需要以下權限:
會報出以下錯誤提示:
Neither user 10076 nor current process has android.permission.STATUS_BAR.
提示缺少權限,Manifest添加之,提示:Permission is only granted to system apps
總結:通過這種方法屏蔽狀态欄下拉,必須得有系統簽名,WTF。。。