当前位置: 移动技术网 > IT编程>移动开发>Android > Android 通知使用权(NotificationListenerService)的使用

Android 通知使用权(NotificationListenerService)的使用

2019年07月24日  | 移动技术网IT编程  | 我要评论

高干小说推荐,铜陵县租房,yy网页版

android  通知使用权(notificationlistenerservice)的使用

简介

当下不少第三方安全app都有消息管理功能或者叫消息盒子功能,它们能管理过滤系统中的一些无用消息,使得消息栏更清爽干净。其实此功能的实现便是使用了android中提供的通知使用权权限。android4.3后加入了通知使用权notificationlistenerservice,就是说当你开发的app拥有此权限后便可以监听当前系统的通知的变化,在android4.4后还扩展了可以获取通知详情信息。下面我们来看看notificationlistenerservice的具体使用。

使用

新建一服务类,使它继承notificationlistenerservice,并实现两个重要的方法:

@targetapi(build.version_codes.jelly_bean_mr2) 
public class notificationlistener extends notificationlistenerservice { 
  privatestatic final string tag = "notificationlistener"; 
  
  @override 
  public void onnotificationremoved(statusbarnotification sbn) { 
    log.i(tag,"notification removed"); 
  } 
  
  @override 
  public void onnotificationposted(statusbarnotification sbn) { 
    log.i(tag, "notification posted"); 
  } 
} 

androidmanifest.xml中声明此服务类,并必须声明bind_notification_listener_service许可和意图过滤器

android.service.notification.notificationlistenerservice,还有我们在系统设置中通知使用权列表中看到的label标签:

<serviceandroid:name=".notificationlistener" 
     android:label="通知使用权测试程序" 
     android:permission="android.permission.bind_notification_listener_service"> 
  <intent-filter> 
    <actionandroid:name="android.service.notification.notificationlistenerservice"/> 
  </intent-filter> 
 </service> 

ok,就这么简单就可以完成app监听系统通知栏的功能了。接下来,我们来看看notificationlistenerservice类还提供了一些重要的方法:

statusbarnotification[] sbns = getactivenotifications();         // 返回当前系统所有通知的数组 
cancelallnotifications();                        // 删除系统中所有可被清除的通知 
cancelnotification(string pkg, string tag, int id);           // 删除具体某一个通知 

还有上面我们提到的两个重要的重写方法:

onnotificationremoved(statusbarnotification sbn);            // 通知被移除时回调 
onnotificationposted(statusbarnotification sbn);             // 增加一条通知时回调 

这两个重要的回调方法它们的参数statusbarnotification对象是当前触发变化通知的详细信息。来看下statusbarnotification的使用:

sbn.getid();                               // 返回通知对应的id 
sbn.getnotification();                          // 返回通知对象 
sbn.getpackagename();                          // 返回通知对应的包名 
sbn.getposttime();                            // 返回通知发起的时间 
sbn.gettag();                              // 返回通知的tag,如果没有设置返回null 
sbn.isclearable();                            // 返回该通知是否可被清楚,是否为flag_ongoing_event、flag_no_clear 
sbn.isongoing();                             // 返回该通知是否在正在运行的,是否为flag_ongoing_event 

其中,getnotification()返回的通知对象,还可以详细看到通知的其它相关信息,如:

notification notification = sbn.getnotification(); 
notification.contentview;                        // 通知的remoteviews 
notification.contentintent;                       // 通知的pendingintent 
notification.actions;                          // 通知的行为数组 
// android4.4后还扩展了可以获取通知详情信息 
if (build.version.sdk_int >build.version_codes.jelly_bean_mr2) { 
     bundle extras = notification.extras; 
     string notificationtitle = extras.getstring(notification.extra_title); 
     int notificationicon = extras.getint(notification.extra_small_icon); 
     bitmap notificationlargeicon = ((bitmap)extras.getparcelable(notification.extra_large_icon)); 
     charsequence notificationtext = extras.getcharsequence(notification.extra_text); 
     charsequence notificationsubtext = extras.getcharsequence(notification.extra_sub_text); 
} 

跳转系统设置里的通知使用权页面

private boolean gotonotificationaccesssetting(contextcontext) { 
  try { 
    intent intent = new intent("android.settings.action_notification_listener_settings"); 
    intent.addflags(intent.flag_activity_new_task); 
    context.startactivity(intent); 
    return true; 
  } catch(activitynotfoundexception e) { 
    try { 
      intent intent = new intent(); 
      intent.addflags(intent.flag_activity_new_task); 
      componentname cn = new componentname("com.android.settings","com.android.settings.settings$notificationaccesssettingsactivity"); 
      intent.setcomponent(cn); 
      intent.putextra(":settings:show_fragment", "notificationaccesssettings"); 
      context.startactivity(intent); 
      return true; 
    } catch(exception ex) { 
      ex.printstacktrace(); 
    } 
    return false; 
  } 
} 

判断是否拥有通知使用权

private boolean notificationlistenerenable() { 
  boolean enable = false; 
  string packagename = getpackagename(); 
  string flat= settings.secure.getstring(getcontentresolver(),"enabled_notification_listeners"); 
  if (flat != null) { 
    enable= flat.contains(packagename); 
  } 
  return enable; 
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网