Android 屏蔽系统通知的几种方法

一、屏蔽SystemUI通知
SystemUI是系统级的apk,其路径为frameworks\base\packages\SystemUI,其主要功能是显示电池信号、通知面板、系统信息、以及第三方应用通知等等。这里列举屏蔽第三方应用等系统底部通知的方法:
路径:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java

   protected NotificationData.Entry createNotificationViews(StatusBarNotification sbn) {
       if (DEBUG) {
           Log.d(TAG, "createNotificationViews(notification=" + sbn);
           }
           final StatusBarIconView iconView = createIcon(sbn);
            if (条件){
                return null;
            }
           NotificationData.Entry entry = new NotificationData.Entry(sbn, iconView);
           if (!inflateViews(entry, mStackScroller)) {
               handleNotificationError(sbn, "Couldn't expand RemoteViews for: " + sbn);
               return null;
           }
           return entry;
       }

从上述代码可得知,当我们不想让通知出现,只需要在createNotificationViews返回null即可。

二、屏蔽特定通知的方法
众所周知Notification就是通知类,发出的通知必然与它有关
其所在的路径为:frameworks/base/core/java/android/app/Notification.java
想要屏蔽特定的通知,可以选择获取到特定通知的内容,以此来做一个判断(假设要屏蔽aiqiyi的通知)

public static boolean isAiqiyiExist = false;
  public Builder setContentText(CharSequence text) {
              mText = safeCharSequence(text);
              if(mText != null && mText.equals("")){
                  int result = mText.toString.indexOf("aiqiyi");
                  if(result != -1){
                      isAiqiyiExist = true;
                  }
              }
              return this;
          }

上述代码定义isAiqiyiExist标志位,当捕捉到此类通知时,会将这个标志位为true。
Notification的显示是在NotificationManager,其路径为:frameworks/base/core/java/android/app/NotificationManager.java
当通知要显示时会调用其中的notify方法

public void notify(int id, Notification notification)
 {
     notify(null, id, notification);
 }

这就是其中的notify方法,所以我们可以加判断来让它有条件的隐藏

 public void notify(int id, Notification notification)
 {
     if(!notification.isAiqiyiExist){    
         notify(null, id, notification);
     }
 }

目前就只发现这两种,未完待续。。。。

你可能感兴趣的:(解决问题)