最近几天碰到一个郁闷的问题,在有些机型上面使用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 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