|
需求:默认屏蔽制定应用的通知 版本: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
|