相信大家在开发的过程中一定也会遇到这样的需求:屏蔽第三方的推送通知。那么怎么屏蔽呢,今天就为大家说明一下怎么拦截APP的推送通知。
其实不止是第三方有推送消息,Android本身的模块也有推送消息的,包括来短信,来电话,下载结束等等,想要拦截这些东西,首先要知道这些推送消息的原理。先来看一下通知管理的代码:frameworks/base/core/java/android/app/NotificationManager.java 看一下其中的notifyAsUser(**)这个方法
}
附:查找手机安装应用的包名:adb shell pm list packages -f
其实不止是第三方有推送消息,Android本身的模块也有推送消息的,包括来短信,来电话,下载结束等等,想要拦截这些东西,首先要知道这些推送消息的原理。先来看一下通知管理的代码:frameworks/base/core/java/android/app/NotificationManager.java 看一下其中的notifyAsUser(**)这个方法
/**
* @hide
*/
public void notifyAsUser(String tag, int id, Notification notification, UserHandle user)
{
int[] idOut = new int[1];
INotificationManager service = getService();
String pkg = mContext.getPackageName();
if(pkg.equals("com.sohu.inputmethod.sogou") ){
Log.i("lyj_sogou","sougou--return");
return;
}
<pre name="code" class="java"> Log.i("lyj_sogou","is not return");
****
}
打一下Log你会发现,你所在的sougou--return会走一次,但是并没有return出去,下面的LOG一直在走,这样的话就不能拦截了,其实真正拦截的地方不是在这里。这个地方是时时在刷新最新的通知,所以LOG一直会走的。那么真正拦截的地方在哪?继续看
看这个路径:frameworks/base/services/core/java/com/android/server/am/ActiveServices.java 里面的这个方法setServiceForegroundLocked(*)
public void setServiceForegroundLocked(ComponentName className, IBinder token,
int id, Notification notification, boolean removeNotification) {
final int userId = UserHandle.getCallingUserId();
final long origId = Binder.clearCallingIdentity();
//M:lyj --start--
if( className.getPackageName().equals("com.sohu.inputmethod.sogou") ){//应用的包名
return;
}
//M:lyj --end--
try{
*****
}finally {
Binder.restoreCallingIdentity(origId);
}
}
这个时候你再编译会看到,你想要拦截的通知已经被拦截了,我们处理的方式是根据应用的包名进行拦截的。这样的话只要你想拦截应用的通知只要知道包名即可。
附:查找手机安装应用的包名:adb shell pm list packages -f