Android5.0 拦截第三方推送的通知消息

相信大家在开发的过程中一定也会遇到这样的需求:屏蔽第三方的推送通知。那么怎么屏蔽呢,今天就为大家说明一下怎么拦截APP的推送通知。
其实不止是第三方有推送消息,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;
        }
         
         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



你可能感兴趣的:(Android5.0 拦截第三方推送的通知消息)