欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-11-21 18:38:46
android  通知使用权(notificationlistenerservice)的使用 简介 当下不少第三方安全app都有消息管理功能或者叫消息盒子...

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; 
} 

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