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常量定义。

 

        因展开和折叠通知栏的类和接口都被隐藏了,所以只能通过反射的方式才能调用,具体代码如下:

 

折叠通知栏:

 

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"/>



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章