须要默认屏蔽特定app的通知提示

设置app是否接收通知的界面

点击每一个条目进去的界面

AppNotificationSettings extends SettingsPreferenceFragment
private SwitchPreference mBlock; //条目通过Preference设置
mBlock.setChecked(mAppRow.banned); mBlock.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public 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是系统包(如计算器)时移除设置通知设置的preference
if (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的属性设置

@Override
public 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中进行改动。

   @Override
public 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 start
if(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 end 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;
}



最后的实现结果

【Notification】屏蔽特定应用的通知提示的更多相关文章

  1. html5桌面通知,notification的使用,右下角出现通知框

    1先判断浏览器是否支持:window.Notification 2判断浏览器是否开启提示的权限:Notification.permission === 'granted'(如果不允许则设置为允许:No ...

  2. 应用 CSS3 动画实现12种风格的通知提示

    今天我们想分享几个简单的款式的网站通知效果.有很多的方式来呈现消息给用户:从经典的咆哮般的通知到窗口顶部的通知栏.各个网站的通知样式和效果千篇一律,难得出现创意的通知效果.这里是实现一个应用 CSS3 ...

  3. 漂亮灵活设置的jquery通知提示插件toastr

    toastr是一款非常棒的基于jquery库的非阻塞通知提示插件,toastr可设定四种通知模式:成功,出错,警告,提示,而提示窗口的位置,动画效果都可以通过能数来设置,在官方站可以通过勾选参数来生成 ...

  4. toastr 通知提示插件

    table.sb-tb td,table.sb-tb th { padding: 5px 10px !important } jquery toastr 一款轻量级的通知提示框插件. 网页开发中经常会 ...

  5. Android中使用Notification在状态栏上显示通知

    场景 状态栏上显示通知效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 新 ...

  6. win10:在关闭防火墙下如何屏蔽特定端口

    如果win10没有组策略,请参考:https://www.cnblogs.com/huiy/p/9291392.html 在"开始"菜单选择"运行",输入&qu ...

  7. Chrome浏览器桌面通知提示设置

    版本 24.0.1312.56 m     老版本23.* 桌面通知,也可以由用户在Chrome浏览器中自定义:板手 -> 选项  -> 高级选项 –> 通知 (管理例外情况…).

  8. 屏蔽ffmpeg命令的所有提示

    有时候需要隐蔽的执行ffmpeg不希望输出任何日志,提示.这个时候只需要多添加这个参数即可 -loglevel quiet

  9. IOS 新消息通知提示-声音、震动

    一.APNS 1.注册 [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificati ...

随机推荐

  1. web前端学习路线和步骤

    H5+全栈工程师  (学习下列技术可以加QQ: 1416 7596 61)第一阶段:初级入门阶段基本功 1.HTML入门 Windows概述.浏览器概述.HTML简介.HTML标签详解.前端开发工具概 ...

  2. Spring框架学习之注解配置与AOP思想

         上篇我们介绍了Spring中有关高级依赖关系配置的内容,也可以调用任意方法的返回值作为属性注入的值,它解决了Spring配置文件的动态性不足的缺点.而本篇,我们将介绍Spring的又一大核心 ...

  3. 15.javaweb XML详解教程

    一.XML语言简介 1,  作用:用于描述和保存现实中具有某种关系的数据,还可以作为软件配置文件,和描述程序模块之间的关系 2,  语法: 首先 先看一个XML文件的组成部分 关于文档声明 Versi ...

  4. 通过扩大IE使用内存,解决skyline在IE下模型不能加载的方法

    环境:skyline TerraExploere 6.6.1,win10 专业版 64位,ie 11 情况描述:在ie下浏览三维场景,ie占用内存不断增大并且内存占用固定在一个最高范围内,三维场景中部 ...

  5. JavaScript:在JS中截取字符串的方法

    这篇主要说一说截取字符串的方法,用于帮助自己缕清方法的作用,参数的意义,返回值,是否对于原来的字符串进行了操作等. 在javascript中,常见的截取字符串的方法有slice().substring ...

  6. Logstash&Redis&Elasticsearch&Kibana

    [搭建] 一个很好的提示,强调版本的一致性 http://www.cnblogs.com/yjf512/p/4194012.html http://michael.bouvy.net/blog/en/ ...

  7. TFboy养成记 简单小程序(Variable & placeholder)

    学习参考周莫烦的视频. Variable:主要是用于训练变量之类的.比如我们经常使用的网络权重,偏置. 值得注意的是Variable在声明是必须赋予初始值.在训练过程中该值很可能会进行不断的加减操作变 ...

  8. js-引用类型-Array

    1.数组的操作方法 <html> <meta http-equiv="content-type" charset="utf-8" /> ...

  9. Java中net.sf.json包关于JSON与对象互转的问题

    在Web开发过程中离不开数据的交互,这就需要规定交互数据的相关格式,以便数据在客户端与服务器之间进行传递.数据的格式通常有2种:1.xml:2.JSON.通常来说都是使用JSON来传递数据.本文正是介 ...

  10. [翻译]Python List Comprehensions: Explained Visually || Python列表解析式

    原文1地址: http://treyhunner.com/2015/12/python-list-comprehensions-now-in-color/ 原文2地址: http://blog.tea ...