说明
在使用继承Android系统提供的NotificationListenerService这个类监听通知栏的过程中,有部分手机在使用一段时间后就无法监听了,重启手机也无效,所以同时使用AccessibilityService能解决这个问题,但是有点小体验不好,后文介绍。
第一步:新建service继承AccessibilityService
/**
* Created by 仁军 on 2017/4/18.
*/
public class NeNotificationService extends AccessibilityService {
private static NeNotificationService service;
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
//判断辅助服务触发的事件是否是通知栏改变事件
if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
Parcelable data = event.getParcelableData();
//判断是否是Notification对象
if (data instanceof Notification) {
Notification notification = (Notification) data;
String pkg = (String) event.getPackageName();
Object fn = notification.extras.get(Notification.EXTRA_TITLE);
Object txt = notification.extras.get(Notification.EXTRA_TEXT);
if (fn == null || txt == null) {
return;
}
String fromName = fn.toString();
String text = txt.toString();
BleLog.e("From package: " + pkg +"fromName: " + fromName + " text: " + text);
}
@Override
public void onInterrupt() {
BleLog.e("onInterrupt");
}
@Override
protected void onServiceConnected () {
BleLog.e("onServiceConnected");
service = this;
//代码设置service 也可以在清单文件中设置
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED |
AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED |
AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
info.notificationTimeout = 100;
setServiceInfo(info);
}
@Override
public void onDestroy() {
super.onDestroy();
service = null;
}
/**
* 判断当前服务是否正在运行
* */
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static boolean isRunning() {
if(service == null) {
return false;
}
AccessibilityManager accessibilityManager = (AccessibilityManager) service.getSystemService(Context.ACCESSIBILITY_SERVICE);
AccessibilityServiceInfo info = service.getServiceInfo();
if(info == null) {
return false;
}
List<AccessibilityServiceInfo> list = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC);
Iterator<AccessibilityServiceInfo> iterator = list.iterator();
boolean isConnect = false;
while (iterator.hasNext()) {
AccessibilityServiceInfo i = iterator.next();
if(i.getId().equals(info.getId())) {
isConnect = true;
break;
}
}
if(!isConnect) {
return false;
}
return true;
}
第二步:在AndroidManifest.xml文件中注册服务,以下为模板
<service
android:name=".service.NeNotificationService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:label="@string/app_name"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService"/>
</intent-filter>
</service>
第三步:开启服务
if (!NeNotificationService.isRunning()) {
Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivity(intent);
}
注意
1.在开启辅助服务时要弹框提示用户授权开启
2.用户退出程序后该app辅助服务权限会自动关闭,需要在程序重新启动时要再次判断服务是否在运行,所以会有每次的弹框提示用户去操作,不过app能不死的就当我没说。