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



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