美文网首页
Android O 通知系统讲解

Android O 通知系统讲解

作者: King_Karl | 来源:发表于2018-10-08 15:20 被阅读0次

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

    版本: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 通知系统讲解

          本文链接:https://www.haomeiwen.com/subject/cphjaftx.html