最近幾天碰到一個鬱悶的問題,在有些機型上面使用PendingIntent.getActivity(context, 0, intent, 0)的方式打開一個指定的Activity後,通知欄並不主動
摺疊,讓我一度的以爲使用PendingIntent.getActivity()的方式無法打開Activity,後面才發現其實已經打開了Activity。但是因爲通知欄沒有主動摺疊,遮擋
了Activity照成的誤解。
查看了Android源碼後發現在android.app包下個被隱藏的類:android.app.StatusBarManager,該類提供了摺疊和展開通知欄的相應方法。使用該類前需要獲得com.android.serevier.StatusBarManager的一個系統服務對象,使用context.getSystemService(“statusbar”);就可以獲取了。這個服務也是被隱藏的。
獲取服務的Key值常量也是被隱藏的。詳見android.content.Context.STATUS_BAR_SERVICE常量定義。
因展開和摺疊通知欄的類和接口都被隱藏了,所以只能通過反射的方式才能調用,具體代碼如下:
摺疊通知欄:
public static void collapsingNotification(Context context) {
Object service = context.getSystemService("statusbar");
if (null == service)
return;
try {
Class<?> clazz = Class.forName("android.app.StatusBarManager");
int sdkVersion = android.os.Build.VERSION.SDK_INT;
Method collapse = null;
if (sdkVersion <= 16) {
collapse = clazz.getMethod("collapse");
} else {
collapse = clazz.getMethod("collapsePanels");
}
collapse.setAccessible(true);
collapse.invoke(service);
} catch (Exception e) {
e.printStackTrace();
}
}
展開通知欄:
public static void expandNotification(Context context) {
Object service = context.getSystemService("statusbar");
if (null == service)
return;
try {
Class<?> clazz = Class.forName("android.app.StatusBarManager");
int sdkVersion = android.os.Build.VERSION.SDK_INT;
Method expand = null;
if (sdkVersion <= 16) {
expand = clazz.getMethod("expand");
} else {
/*
* Android SDK 16之後的版本展開通知欄有兩個接口可以處理
* expandNotificationsPanel()
* expandSettingsPanel()
*/
//expand =clazz.getMethod("expandNotificationsPanel");
expand = clazz.getMethod("expandSettingsPanel");
}
expand.setAccessible(true);
expand.invoke(service);
} catch (Exception e) {
e.printStackTrace();
}
}
注意:展開/摺疊通知欄需要申請在AndroidManifest.xml中添加如下權限:
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>