1. 程式人生 > >Android 展開/摺疊 系統下拉通知欄

Android 展開/摺疊 系統下拉通知欄

         最近幾天碰到一個鬱悶的問題,在有些機型上面使用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常量定義。因展開和摺疊通知欄的類和介面都被隱藏了,所以只能通過反射的方式才能呼叫,具體程式碼如下:

/**
	 * 摺疊通知欄
	 * 
	 * @param context
	 */
	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();
		}
	}

/**
	 * 摺疊通知欄
	 * 
	 * @param context
	 */
	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();
		}
	}
不要漏了這個許可權:
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>

原文地址:http://blog.csdn.net/xiongwei3673605/article/details/42875017