Android 展開/摺疊 系統下拉通知欄
阿新 • • 發佈:2019-02-07
最近幾天碰到一個鬱悶的問題,在有些機型上面使用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