Android O 通知系统讲解

需求:默认屏蔽制定应用的通知

版本:Android O

分析:如果在发送通知时根据制定的packagename做黑名单处理,需要自己添加一套逻辑

            实际android最新版本已经支持了对指定应用做通知限制的功能

          (“设置”的“应用通知”可以设置,也可以根据channel名称来做更细致的控制)

代码:

            NotificationManagerService.java

                    onStart函数中会调用init函数,其中new AtomicFile(new File(systemDir, "notification_policy.xml"))

                    这个AtomicFile 就是“/data/system/notification_policy.xml”,里面保存的就是系统和通知相关的policy文件(和packages.xml一样都是一些系统配置文件)

                    init函数中调用loadPolicyFile();

                    第一次调用policy文件不存在所以调用readDefaultApprovedServices(UserHandle.USER_SYSTEM);

                    根据com.android.internal.R.string.config_defaultListenerAccessPackages

                    和com.android.internal.R.string.config_defaultDndAccessPackages 设置listener和dnd的白名单


                    android系统起来之后会调用SystemNotificationChannels.java 的createAll函数

                    去创建 

   public static String VIRTUAL_KEYBOARD = "VIRTUAL_KEYBOARD";

    public static String PHYSICAL_KEYBOARD = "PHYSICAL_KEYBOARD";

    public static String SECURITY = "SECURITY";

    public static String CAR_MODE = "CAR_MODE";

    public static String ACCOUNT = "ACCOUNT";

    public static String DEVELOPER = "DEVELOPER";

    public static String UPDATES = "UPDATES";

    public static String NETWORK_STATUS = "NETWORK_STATUS";

    public static String NETWORK_ALERTS = "NETWORK_ALERTS";

    public static String NETWORK_AVAILABLE = "NETWORK_AVAILABLE";

    public static String VPN = "VPN";

    public static String DEVICE_ADMIN = "DEVICE_ADMIN";

    public static String ALERTS = "ALERTS";

    public static String RETAIL_MODE = "RETAIL_MODE";

    public static String USB = "USB";

    public static String FOREGROUND_SERVICE = "FOREGROUND_SERVICE";


SystemUI起来也会调用自己的NotificationChannels.java中的createAll去创建

    public static String ALERTS = "ALR";

    public static String SCREENSHOTS = "SCN";

    public static String GENERAL    = "GEN";

    public static String STORAGE    = "DSK";

    public static String TVPIP      = "TPP";

    public static String BATTERY    = "BAT";


                对比打开和关闭通知时文件的变化,发现在package标签中多了importance="0"


解决方案:

    RankingHelper.java中onPackagesChanged函数中添加

getOrCreateRecord(pkg, mPm.getPackageUidAsUser(pkg, changeUserId)).importance = NotificationManager.IMPORTANCE_NONE;

即:监听应用安装然后根据自己定义的黑名单,  然后用setImportance的方式把这个应用的importance设置成  IMPORTANCE_NONE

PS:模拟器有BUG第一次安装应用收不到PACKAGE_ADD的intent广播。。。。。。


=======待整理=====

NotificationManager.java

IMPORTANCE_NONE

IMPORTANCE_MIN

IMPORTANCE_LOW

IMPORTANCE_DEFAULT

IMPORTANCE_HIGH

IMPORTANCE_MAX

你可能感兴趣的:(Android O 通知系统讲解)