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