须要默认屏蔽特定app的通知提示
设置app是否接收通知的界面
点击每一个条目进去的界面

AppNotificationSettings extends SettingsPreferenceFragment
private SwitchPreference mBlock; //条目通过Preference设置
mBlock.setChecked(mAppRow.banned);mBlock.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {final boolean block = (Boolean) newValue;return mBackend.setNotificationsBanned(pkg, uid, block);
}});// Users cannot block notifications from system/signature packages//通过工具类推断app是系统包(如计算器)时移除设置通知设置的preferenceif (Utils.isSystemPackage(pm, info)) {getPreferenceScreen().removePreference(mBlock);mPriority.setDependency(null); // don't have it depend on a preference that's gone}

通过对Block的当前状态通过mAppRow设置
对preference状态的监听,通过mBackend实现
import com.android.settings.notification.NotificationAppList.AppRow;
import com.android.settings.notification.NotificationAppList.Backend;

查看NotificationAppList.java

    //对AppRow中的属性进行初始化public static AppRow loadAppRow(PackageManager pm, ApplicationInfo app,Backend backend) {final AppRow row = new AppRow();row.pkg = app.packageName;row.uid = app.uid;try {row.label = app.loadLabel(pm);} catch (Throwable t) {Log.e(TAG, "Error loading application label for " + row.pkg, t);row.label = row.pkg;}row.icon = app.loadIcon(pm);row.banned = backend.getNotificationsBanned(row.pkg, row.uid);// 是否禁止通知row.priority = backend.getHighPriority(row.pkg, row.uid);row.sensitive = backend.getSensitive(row.pkg, row.uid);return row;
}


查看INotificationManager接口
find frameworks/ -name “INotification*”
frameworks/support/v4/java/android/support/v4/app/INotificationSideChannel.aidl
frameworks/base/core/java/com/mediatek/common/mom/INotificationListener.aidl
frameworks/base/core/java/android/app/INotificationManager.aidl
frameworks/base/core/java/android/service/notification/INotificationListener.aidl

.aidl文件(接口定义语言,用于进程间通讯)
frameworks/base/core/java/android/app/INotificationManager.aidl
实现的service路径为
frameworks\base\services\java\com\android\server\NotificationManagerService.java

对接受Notification属性的获取

mService的类型IAppOpsService
frameworks/base/core/java/com/android/internal/app/IAppOpsService.aidl
frameworks/base/services/core/java/com/android/server/AppOpsService.java

返回的值为MODE_IGNORED时,boolean areNotificationsEnabledForPackage(String pkg, int uid)会返回false
mService.checkOperation(op, uid, packageName) = MODE_ALLOWED时。则同意接收通知 ;

对接受Notification的属性设置

@Overridepublic void setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled) {checkCallerIsSystem();setNotificationsEnabledForPackageImpl(pkg, uid, enabled);}


AppOpsManager的路径:frameworks/base/core/java/android/app/AppOpsManager.java

public static final int OP_POST_NOTIFICATION = 11;
uid = app.uid
pkg = app.packageName;
mode = enabled?AppOpsManager.MODE_ALLOWED:AppOpsManager.MODE_IGNORED

查看代码中哪些位置调用了setNotificationsEnabledForPackageImpl方法

除此处还有两处都是对方法的重写与详细实现

详细解决步骤

当须要屏蔽全部应用通知没有例外时
在AppOpsManager中有关于app很多參数设置的默认值,比方图中第十二个就是默认对app的通知开启或关闭。AppOpsService中的checkOperation方法下就进行了推断。当op为空时。返回的时默认的MODE。

所以讲原本的MODE_ALLOWED改为MODE_IGNORED后。编译frameworks/base后push进手机重新启动就会发现全部app全部被屏蔽通知没有例外。

当有特定的app须要开启通知时,我们能够在checkOperation中进行改动。

   @Overridepublic int checkOperation(int code, int uid, String packageName) {verifyIncomingUid(uid);verifyIncomingOp(code);synchronized (this) {if (isOpRestricted(uid, code, packageName)) {return AppOpsManager.MODE_IGNORED;}Op op = getOpLocked(AppOpsManager.opToSwitch(code), uid, packageName, false);if (op == null) {return AppOpsManager.opToDefaultMode(code);}return op.mode;}
}

在checkOperation中进行推断时须要推断code值。否则easy出现点击重新启动的状况。改动后代码例如以下。

public int checkOperation(int code, int uid, String packageName) {verifyIncomingUid(uid);verifyIncomingOp(code);synchronized (this) {//chenzilong add for ZELY-41 block app notifications 20160331 startif(code == AppOpsManager.OP_POST_NOTIFICATION){if ((packageName.equals("com.advan.advanstore")||packageName.equals("com.stkj.android.freeshare"))){return AppOpsManager.MODE_ALLOWED;}else{return AppOpsManager.MODE_IGNORED;}}// chenzilong add for ZELY-41 block app notifications 20160331 endif (isOpRestricted(uid, code, packageName)) {return AppOpsManager.MODE_IGNORED;}Op op = getOpLocked(AppOpsManager.opToSwitch(code), uid, packageName, false);if (op == null) {return AppOpsManager.opToDefaultMode(code);}return op.mode;}


最后的实现结果

【Notification】屏蔽特定应用的通知提示相关推荐

  1. android8.1 屏蔽通知提示

    注意区分通知和广播 在通知服务中 frameworks/base/services/core/java/com/android/server/notification/NotificationMana ...

  2. php通知前端,HTML5桌面通知提示功能的实现

    HTML5赋予网页更好的意义和结构.更加丰富的标签将随着对RDFa的,微数据与微格式等方面的支持,构建对程序.对用户都更有价值的数据驱动的Web.本文我们就和大家分享HTML5实现桌面通知提示功能. ...

  3. 安卓html5桌面提醒,HTML5桌面通知提示功能的实现

    HTML5赋予网页更好的意义和结构.更加丰富的标签将随着对RDFa的,微数据与微格式等方面的支持,构建对程序.对用户都更有价值的数据驱动的Web.本文我们就和大家分享HTML5实现桌面通知提示功能. ...

  4. Android Service下载文件并自定义通知提示下载

    最近要做一个更新sdk,里面用到了service后台下载,自定义通知提示下载进度,下面直接贴上代码. 下面是UpdateUtils.java ,告诉你如何使用 package com.cnziz.up ...

  5. android 10.0 SystemUI屏蔽某个app的通知

    1.概述 在10.0的系统产品开发中,产品有需求,需要状态栏不显示某个app的通知,根据SystemUI源码通知显示流程可以得知NoticationFilter.java中可以处理过滤通知 2.Sys ...

  6. Android开发之Notification(实现消息弹窗、提示音以及点击事件)

    文章目录 通知管理器 通知渠道 通知 发送通知 更多效果 添加点击事件 取消消息 通知管理器 通知管理器(NotificationManager)类是一个通知管理器,这个对象是由系统维护的服务,是以单 ...

  7. android notification应用之自定义来电通知

    android notification应用之自定义来电通知 1.为了实现老板的各种要求 本人矜矜业业完成任务 随着这个软电话软件的日益完善 本来来电的时候是创建一条通知点亮屏幕 用户可以解锁屏幕后接 ...

  8. iPhone 13锁屏无法收到微信通知提示怎么解决?

    相信有很多小伙伴已经入手了iPhone 13,但是出现了很多问题.今天小编就来介绍一下怎么解决微信锁屏后收不到消息. 近日,一些iPhone 13和iPhone 13 Pro系列机型的用户反馈手机在锁 ...

  9. Mac上的Safari怎么屏蔽特定网站

    小编在这里说的是通过修改系统文件来屏蔽特定网站(当然还有其他方式,比如:1,创立新的登录账户,然后进行家长控制:2,安装第三方的应用软件Self Control:3,其他方式). 小编的系统信息截图如 ...

  10. MAC 下屏蔽特定网址

    只需要在Host中进行操作即可 参考: 教你两步在mac下屏蔽某指定网站 - 简书由于某种原因,我们希望在网络正常的情况下屏蔽掉一些网站,今天我就教大家两步实现屏蔽特定网站的方法: 1,找到hosts ...

最新文章

  1. 14年12月CCF真题1-门禁系统
  2. USACO_1_4_Mother's Milk
  3. 二〇二二注定是踔厉奋发、笃行不怠的一年
  4. python精确计时_PYTHON在WINDOWS下高精度计时的体会
  5. [实验手册]MPLS/×××分解:防止PE-CE的路由环路
  6. css3的新增选择器 200303
  7. Ubuntu系统安装Ruby的三种方法
  8. Session何时创建实例
  9. [转载] python eval序列化函数
  10. React 从入门到进阶之路(二)
  11. PHP获取一篇文章内容中的全部图片,并下载
  12. 杭电 hdu 2002
  13. [RK3288][Android6.0] 如何配置MIPI DSI Clock和PCLK
  14. getpass函数用法
  15. 使用神经网络实现对天气的预测
  16. Shodan Hacking
  17. 有哪些好用的抠图网站?这种方法超好用
  18. 搜索框输入内容进行查找匹配
  19. 收银系统可以管理童装店衣服不同的尺码吗?
  20. 万字好文!探究Java的设计原则,看了都说好!

热门文章

  1. Centos-6.3-x86_64 minimal 迷你版安装笔记 - Java篇
  2. 转:Android ViewPager多页面滑动切换以及动画效果
  3. 启动与关闭VMware Workstation的BAT批处理脚本
  4. Jquery如何操作Table的某一个td
  5. 使用 typescript ,提升 vue 项目的开发体验(2)
  6. 关于sql语句between and的边界问题
  7. 3.9上午(周彤彤)
  8. bzoj4093: [Usaco2013 Dec]Vacation Planning
  9. 以一种访问权限不允许的方式做了一个访问套接字的尝试。
  10. 开发者经常用到的75 个功能强大的 jQuery插件和教程汇总(上篇)