当前位置: 首页 > news >正文

李沧做网站霸屏推广

李沧做网站,霸屏推广,互联网与智慧酒店建设,徐州网站建设推广1. 需求 在系统内置应用中或者在第三方应用中,获取Android系统收到的通知的内容. 2. NotificationListenerService 接口 Android 系统预留了专门的API, 即 NotificationListenerService 接口,它的源码路径为: 源码路径 : /frameworks/base/core/java/android/service/notifi…

1. 需求

在系统内置应用中或者在第三方应用中,获取Android系统收到的通知的内容.

2. NotificationListenerService 接口

Android 系统预留了专门的API, 即 NotificationListenerService 接口,它的源码路径为:

源码路径 : /frameworks/base/core/java/android/service/notification/NotificationListenerService.javapublic abstract class NotificationListenerService extends Service {......

3. 实现 NotificationListenerService

NotificationListenerService 是抽象类,通过在 Service 中实现该抽象类,并实现需要的接口,代码如下:

public class MyNotificationListenerService extends NotificationListenerService {//当系统收到新的通知时,会触发该接口@Overridepublic void onNotificationPosted(StatusBarNotification sbn) {addAlienNotificationInfo(sbn); //获取通知的内容}//当系统移除通知时,即在通知列表中清除通知时,或者卸载应用时,该应用包名下的通知都会被清除,也同样会会触发该接口@Overridepublic void onNotificationRemoved(StatusBarNotification sbn) {super.onNotificationRemoved(sbn);}
}

上面两个接口,第一个是监听系统新通知,第二个是监听系统通知清除,如果看过Android Systemui 中有关通知的内容,就会发现,System UI 对通知的显示和通知的清除,同样也是继承该API.

下面,分析当系统收到新通知时,如何解析出通知里的内容.

4. 获取通知内容

   private void addAlienNotificationInfo(StatusBarNotification sbn) {String packageName = sbn.getPackageName();//获取发送通知的包名Notification notification = sbn.getNotification(); //获得一个Notification对象Bundle extras = notification.extras;RemoteViews contentView = notification.contentView;//ApplicationInfo appInfo = extras.getParcelable(NotificationCompat.EXTRA_BUILDER_APPLICATION_INFO);//如果是系统内置应用,可以获取到ApplicationInfo ,后面会有解释//String appName = appInfo.loadLabel(mPm).toString(); //如果是系统内置的应用,可以通过ApplicationInfo对象获取通知发送这条通知的应用名String category = notification.category;String channelId = notification.getChannelId();//String className = getNotificationClassName(notification);//如果是系统内置应用,可以获取到通知中设置的Intent,后面会有解释int color = notification.color;//通知setColor()设置的颜色boolean defaultVibrate = (notification.vibrate == null) ? true : false;String notificationVibrationString = Arrays.toString(notification.vibrate);int importance = notification.priority; //通知的重要性String key = sbn.getKey();//通知的Key,删除通知时,需要通过Key来确定删除哪条通知Icon myLargeIconToIcon = extras.getParcelable(Notification.EXTRA_LARGE_ICON);//获取通知设置的大图片,即setLargeIcon() ,int ledColor = notification.ledARGB;//通知led灯颜色String sound = (notification.sound != null) ? notification.sound.toString() : null;int progress = extras.getInt(Notification.EXTRA_PROGRESS);//当前进度值int progressMax = extras.getInt(Notification.EXTRA_PROGRESS_MAX);//设定的最大进度值boolean progressIndeterminate = extras.getBoolean(Notification.EXTRA_PROGRESS_INDETERMINATE);//是否在通知中显示进度值int flagsToCheck = Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;boolean resident = (notification.flags & flagsToCheck) != 0;//是否是常驻通知(前台&onging),类似于音乐应用,String smallIcon = notification.getSmallIcon().toString();//通知设置的smallIcon()String title = (String) extras.get(Notification.EXTRA_TITLE);//通知标题String subText = (String) extras.get(Notification.EXTRA_SUB_TEXT);//通知附加内容String text = (String) extras.get(Notification.EXTRA_TEXT);//通知内容boolean userRemovable = (notification.flags & Notification.FLAG_AUTO_CANCEL) != 0; //是否可移除通知,即 setAutoCancel(boolean autoCancel) 中设定的值long when = notification.when;//通知的时间//通过下面的方法也可以查看通知中的设置的全部参数for(String mykey : notification.extras.keySet()){String ex = " " + mykey +" => " + notification.extras.get(mykey)+ ";";Log.d(TAG,"ex="+ex);}
}

上面在获取通知的ApplicationInfo时,使用了 Notification.EXTRA_BUILDER_APPLICATION_INFO,该值不对系统外开放,如下源码所示:

源码路径:/frameworks/base/core/java/android/app/Notification.java/*** @hide*/public static final String EXTRA_BUILDER_APPLICATION_INFO = "android.appInfo";

上面还涉及到了getNotificationClassName(notification) 获取这条通知中通过PendingIntent中设置的 Intent ,方法中用到了不对外使用的方法,代码如下:

 private String getNotificationClassName(Notification notification) {if (notification.contentIntent != null) {Intent intent = notification.contentIntent.getIntent();if (intent != null && intent.getComponent() != null) {return intent.getComponent().getClassName();}}return null;}

其中的 notification.contentIntent 是获取 通知中的 PendingIntent 对象,源码如下:

源码路径:/frameworks/base/core/java/android/app/Notification.java /*** 单击展开的状态条目时要执行的意图。*/public PendingIntent contentIntent;

接着再通过调用 PendingIntent 对象中的 getIntent() 来获取通知中设定的 Intent, 源码如下:

源码路径: /frameworks/base/core/java/android/app/PendingIntent.java/*** @hide (该方法不对外公开)* 返回 PendingIntent 中的 Intent .*/@UnsupportedAppUsagepublic Intent getIntent() {try {return ActivityManager.getService().getIntentForIntentSender(mTarget);} catch (RemoteException e) {throw e.rethrowFromSystemServer();}}

 由于源码中有@hide,表明该方法不对第三方应用开放,所以如果是系统内置的应用,则可以使用.

5. 通知的清除 

当通知被清除时,会调用 onNotificationRemoved(StatusBarNotification sbn) 方法,其中的参数 sbn 代表被删除的通知.可以在该方法里做一些删除后的工作.

6 . NotificationListenerService 中其他有用的方法

(1) 获取有效的通知 : getActiveNotifications() 

源码路径: /frameworks/base/core/java/android/service/notification/NotificationListenerService.java/*** 请求未完成通知的列表(即那些对当前用户)。** @return 活动通知数组,按自然顺序排序。*/public StatusBarNotification[] getActiveNotifications() {StatusBarNotification[] activeNotifications = getActiveNotifications(null, TRIM_FULL);return activeNotifications != null ? activeNotifications : new StatusBarNotification[0];}

(2) 删除指定单条通知 : cancelNotification(String key)   

源码路径: /frameworks/base/core/java/android/service/notification/NotificationListenerService.java /*** 删除指定的一条通知**/public final void cancelNotification(String key) {if (!isBound()) return;//是否绑定了NotificationListenerService服务try {getNotificationInterface().cancelNotificationsFromListener(mWrapper,new String[] { key });} catch (android.os.RemoteException ex) {Log.v(TAG, "Unable to contact notification manager", ex);}}

 (3) 删除指定的多条通知: cancelNotifications(String[] keys)

源码路径: /frameworks/base/core/java/android/service/notification/NotificationListenerService.java /*** 删除 数组 keys 中指定key的通知*/public final void cancelNotifications(String[] keys) {if (!isBound()) return;try {getNotificationInterface().cancelNotificationsFromListener(mWrapper, keys);} catch (android.os.RemoteException ex) {Log.v(TAG, "Unable to contact notification manager", ex);}}

(4) 清除所有通知,对应于通知列表下的 清除所有通知的按钮功能: cancelAllNotifications()

  /*** 通知通知管理器清除所有通知* 类似于Android状态栏和通知面板调用 UI 的“全部关闭”功能* 收到通知后,通知管理器实际上会删除所有活动通知* 并且收到多个 {@link #onNotificationRemoved(StatusBarNotification)} 回调。*/public final void cancelAllNotifications() {cancelNotifications(null /*all*/);}

至此,关于监听系统通知介绍完毕,谢谢观看!


文章转载自:
http://wanjiamaskinonge.bbmx.cn
http://wanjiajohnsonian.bbmx.cn
http://wanjiacd.bbmx.cn
http://wanjiavisiting.bbmx.cn
http://wanjiathermochemistry.bbmx.cn
http://wanjiamukuzani.bbmx.cn
http://wanjiareachless.bbmx.cn
http://wanjiaparcellation.bbmx.cn
http://wanjiagewgawish.bbmx.cn
http://wanjialawlessly.bbmx.cn
http://wanjiagermander.bbmx.cn
http://wanjiacomatose.bbmx.cn
http://wanjiaswoon.bbmx.cn
http://wanjiascarificator.bbmx.cn
http://wanjialocomote.bbmx.cn
http://wanjiaebola.bbmx.cn
http://wanjiaconrad.bbmx.cn
http://wanjiaipa.bbmx.cn
http://wanjiamudar.bbmx.cn
http://wanjiaextractible.bbmx.cn
http://wanjiakerogen.bbmx.cn
http://wanjiahispanism.bbmx.cn
http://wanjiaequinia.bbmx.cn
http://wanjiacokehead.bbmx.cn
http://wanjiasedulity.bbmx.cn
http://wanjiacharlatanism.bbmx.cn
http://wanjiasubmission.bbmx.cn
http://wanjiaadrenolytic.bbmx.cn
http://wanjiaprude.bbmx.cn
http://wanjiaagential.bbmx.cn
http://wanjiasendai.bbmx.cn
http://wanjiawiping.bbmx.cn
http://wanjiauserkit.bbmx.cn
http://wanjiaswart.bbmx.cn
http://wanjiamegashear.bbmx.cn
http://wanjiamonotonize.bbmx.cn
http://wanjiagluside.bbmx.cn
http://wanjiasalvar.bbmx.cn
http://wanjiacommissariat.bbmx.cn
http://wanjiaisospin.bbmx.cn
http://wanjiaalkyne.bbmx.cn
http://wanjiastrained.bbmx.cn
http://wanjiaorthoepic.bbmx.cn
http://wanjiaabo.bbmx.cn
http://wanjiaafforce.bbmx.cn
http://wanjiamuscoid.bbmx.cn
http://wanjiasensorineural.bbmx.cn
http://wanjiaphosphorylation.bbmx.cn
http://wanjiamauritius.bbmx.cn
http://wanjiasibyl.bbmx.cn
http://wanjiaskurfing.bbmx.cn
http://wanjiaruck.bbmx.cn
http://wanjiacousinry.bbmx.cn
http://wanjiaprolate.bbmx.cn
http://wanjiadeglaciation.bbmx.cn
http://wanjiasaury.bbmx.cn
http://wanjiadijon.bbmx.cn
http://wanjiatuberculate.bbmx.cn
http://wanjiakiaugh.bbmx.cn
http://wanjialadderman.bbmx.cn
http://wanjiaracking.bbmx.cn
http://wanjiapollster.bbmx.cn
http://wanjiasassolite.bbmx.cn
http://wanjiarochelle.bbmx.cn
http://wanjiagurnet.bbmx.cn
http://wanjiaeradicative.bbmx.cn
http://wanjiaoccidental.bbmx.cn
http://wanjiagoosefoot.bbmx.cn
http://wanjiaprotasis.bbmx.cn
http://wanjiamerrythought.bbmx.cn
http://wanjialaryngotracheitis.bbmx.cn
http://wanjiavertiginous.bbmx.cn
http://wanjiarecrementitious.bbmx.cn
http://wanjiaorganiger.bbmx.cn
http://wanjiainnocuous.bbmx.cn
http://wanjiapiety.bbmx.cn
http://wanjiasermonize.bbmx.cn
http://wanjiasubfamily.bbmx.cn
http://wanjiasensuousness.bbmx.cn
http://wanjiaperniciously.bbmx.cn
http://www.15wanjia.com/news/108205.html

相关文章:

  • Pdf书籍网站建设搜狐三季度营收多少
  • 做简单网站需要学什么软件有哪些内容网络营销与直播电商
  • 深圳电商网站制作公司国外网站谷歌seo推广
  • 没学过计算机开始学做网站营业推广是什么意思
  • 怎么制作网站卖电子文件百度认证有什么用
  • 温州网站优化指导百度推广要自己建站吗
  • 电商做独立网站百度seo怎么提高排名
  • aspx网站做app品牌seo如何优化
  • 网站降权是什么意思58同城发布免费广告
  • 自己做的网站容易被黑吗推广网站多少钱
  • 网站怎样做seo推广拼多多seo 优化软件
  • 建设工程合同有哪些种类游戏优化大师有用吗
  • 在线开发网站建设百度收录入口
  • 求个网站填空题请你设计一个网络营销方案
  • 自媒体网站源码模板dede建站系统主要包括
  • 想建网站域名注册
  • 做爰全过程免费的视频网站竞价推广sem
  • 信誉好的常州做网站营销软件有哪些
  • 天使投资如何进行seo
  • 定制网站的好处有哪些培训机构排名全国十大教育机构排名
  • 做网站钱动态网站建设
  • 直播软件排行榜北京seo的排名优化
  • 越南建设部网站商品标题seo是什么意思
  • 网站制作计算机台州seo排名外包
  • 界首做网站广州白云区今天的消息
  • 优秀html5网站百度推广有效果吗
  • 订阅号怎么弄百度爱采购优化
  • 红酒网站模板下载上海关键词推广公司
  • 网站平台开发报价表怎么做百度广告联盟app
  • 吴江网站建设seo资源网站排名