asysbang

 找回密码
 立即注册
查看: 4369|回复: 0
打印 上一主题 下一主题

Android8通知系统详解

[复制链接]

520

主题

2

好友

6551

积分

管理员

Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

最佳新人 活跃会员 热心会员 推广达人 宣传达人 灌水之王 突出贡献 优秀版主 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2019-9-3 14:45:11 |只看该作者 |倒序浏览
需求:默认屏蔽制定应用的通知
版本: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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|aSys-帮 ( 京ICP备13033689号 )

GMT+8, 2026-1-28 17:52 , Processed in 0.043990 second(s), 19 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部