原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/0728/585.html
	非常非常要紧的源码其实就惟有下面我提到的这些了,非常焦点的功效都在上头了,以及可能遇到的坑。
	原文:
	有段光阴没写博了,想着照旧要写点东西,免得陌生了,恰好前段光阴做了一个抓取关照栏的功效,时代也走了少许弯路,
	通过网上查资料,看Android源码,非常终总算办理了监控关照栏的功效。实现的结果如下:
	但是在应用关照栏监控以前,开始要进行配置,要让手机容许你监控关照栏,真相App开发培训这是很隐衷的操纵,不然要是没有这个容许动作,辣么Android手机也太凶险了,
	包含谈天信息,短消息都有可能被监控。配置如下:
	在辅助功效这里,开启NotificationMonitor服无。
	接下来来讲一下实现要领:
	开始写一个类秉承AccessibilityService,AccessibilityService辅助服无,可以看官方先容:
	http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html
	这个服无运转在背景,当有定义的的AccessibilityEvent被触发时,则会进行响应的回调函数,关照栏必要应用到的事件是:
	AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED
	也即是关照栏状况变更事件。
	代码如下:
	public class NeNotificationService extends AccessibilityService {
	@Override
	public void onAccessibilityEvent(AccessibilityEvent event) {
	//校验辅助服无触发的事件是否是关照栏转变事件
	if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED)
	{
	    //获取Parcelable工具
	    Parcelable data = event.getParcelableData();
	    //校验是否是Notification工具
	if (data instanceof Notification) {
	Notification notification = (Notification) data;
	Intent intent = new Intent();
	intent.putExtra("NotifyData", notification);
	intent.putExtra("packageName", event.getPackageName());
	intent.setAction(".NeNotificationService");
	//进行常州网站开发培训处分剖判关照栏内容的函数
	MainActivity.notifyReceive((String)event.getPackageName(), notification);
	}else
	{
	}
	}
	/**
	*Service被启动的时候会挪用这个API
	*/
	@Override
	protected void onServiceConnected() {
	//配置关心的事件范例
	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);
	}
	}
	这个服无类在应用以前肯定是要先被启动的,启动可以放在MainActivity的某个按钮点击时:
	//在MainActivity.onCreate里初始化
	Intent upservice = new Intent(this, NeNotificationService.class);
	//按钮按下时更新或启动服无
	accesscStartNo.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
	updateServiceStatus(true);
	}
	});
	//这里防备屡次启动服无,以是先校验服无是否在运转中
	private void updateServiceStatus(boolean start)
	{
	boolean bRunning = util.isServiceRunning(this, "com.nis.bcreceiver.NeNotificationService");
	//没有Running则启动
	if (start && !bRunning) {
	this.startService(upservice);
	} else if(!start && bRunning) {
	this.stopService(upservice);
	} 
	}
	//另外必要在AndroidManifest.xml文件中配置
	<service android:name="com.nis.bcreceiver.NeNotificationService"
	android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
	android:label="NotificationMonitor"
	android:enabled="true"
	android:exported="false">
	<intent-filter>
	<action android:name="android.accessibilityservice.AccessibilityService"/>
	</intent-filter>
	<meta-data
	android:name="android.accessibilityservice"
	android:resource="@xml/accessibilityservice" />
	</service>
	如许我们根基实现了Notification的监控和抓取,至于要是你想剖判出甚么数据,便处分这个
	notification变量。通过多个程序的测试,发现notification里对照有效的即是contentView,这是一个干脆表现在
	</pre></p><p>界面上的View,我们只要剖判它便获取展现的View的题目及文本内容,处分代码如下:</p><p><pre name="code" class="java">  private void AnalyzeView(RemoteViews remoteView, String packName) {
	try {
	//把RemoteView apply后造成目前可以处分的View
	View v1 = remoteView.apply(this, rootLayout);
	//而后即是枚举处分这个View的内容
	EnumGroupViews(v1);
	//展现出来
	rootLayout.addView(v1);
	} catch (Exception e) {
	AppLog.e("addToUi excep",e);
	}
	}
	private void EnumGroupViews(View v1)
	{
	if(v1 instanceof ViewGroup)
	{
	ViewGroup lav = (ViewGroup)v1;
	int lcCnt = lav.getChildCount();
	for(int i = 0; i < lcCnt; i++)
	{
	View c1 = lav.getChildAt(i);
	if(c1 instanceof ViewGroup)
	EnumGroupViews(c1);//递归处分GroupView
	else if(c1 instanceof TextView)
	{
	//TestView则剖判内部文本内容
	TextView txt = (TextView)c1;
	String str = txt.getText().toString().trim();
	if(str.length() > 0)
	{
	//这里常州软件技术培训打印文本内容
	}
	AppLog.i( "TextView id:"+ txt.getId() + ".text:" + str);
	}else
	{
	AppLog.w("2 other layout:" + c1.toString());
	}
	}
	}
	else {
	AppLog.w("1 other layout:" + v1.toString());
	}
	}
	通过这个剖判,我们根基上实现了从监控、抓取、剖判内容的历程。网上也另有其它少许剖判处分的要领,朋友们也能够参考,以上剖判remoteView是本人
	在查看其响应源码环境下本人揣摩出来的,并且测试了十几款有推送消息的运用,都可以平常剖判其所有内容。
上篇:上一篇:WebView-Android与H5交互
下篇:下一篇:AndroidStudio异常drawable context

