Filterandroid
‘壹’ android intent filter 怎么获得数据
千 锋扣丁学堂iOS开发为您解答:
1. Android把安装的包中可获得的Intent Filter放到一个列表中。
2. 动作和与正在解析的Intent的种类不关联的Intent Filter会从列表中删除。
2.1. 动作匹配指Android Intent Filter包含特定的动作或没有指定的动作。一个Intent Filter有一个或多个定义的动作,如果没有任何一个能与Intent指定的动作匹配的话,这个Intent Filter在算作是动作匹配检查失败。
2.2. 种类匹配更为严格。Intent Filter必须包含所有在解析的Intent中定义的种类。一个没有特定种类的Intent Filter只能与没有种类的Intent匹配。
3. Intent的数据URI中的部分会与Intent Filter中的data标签比较。如果Intent Filter定义scheme,host/authority,path或mimetype,这些值都会与Intent的URI比较。任何不匹配都会导致Intent Filter从列表中删除。
没有指定data值的Android Intent Filter会和所有的Intent数据匹配。
3.1. mimetype是正在匹配的数据的数据类型。当匹配数据类型时,你可以使用通配符来匹配子类型(例如,earthquakes/*)。如果Intent Filter指定一个数据类型,它必须与Intent匹配;没有指定数据的话全部匹配。
3.2. scheme是URI部分的协议——例如,http:,mailto:,tel:。
3.3. host-name或“data authority”是介于URI中scheme和path之间的部分。匹配主机名时,Intent Filter的scheme也必须通过匹配。
3.4. 数据path是紧接在“data authority”的后面(例如,/ig)。path只在scheme和host-name部分都匹配的情况下才匹配。
4. 如果这个过程中多于一个组件解析出来的话,它们会以优先度来排序,可以在Android Intent Filter的节点里添加一个可选的标签。最高等级的组件会返回。
Android本地的应用程序组件和第三方应用程序一样,都是Intent解析过程中的一部分。它们没有更高的优先度,可以被新的Activity完全的代替,这些新的Activity宣告自己的Intent Filter能响应相同的动作请求。
‘贰’ android有序广播和无序广播的区别
BroadcastReceiver所对应的广播分两类:普通广播和有序广播。
普通广播:通过Context.sendBroadcast()方法来发送,它是完全异步的。
所有的receivers(接收器)的执行顺序不确定,因此所有的receivers(接收器)接收broadcast的顺序不确定。
这种方式效率更高,但是BroadcastReceiver无法使用setResult系列、getResult系列及abort(中止)系列API
有序广播:是通过Context.sendOrderedBroadcast来发送,所有的receiver依次执行。
BroadcastReceiver可以使用setResult系列函数来结果传给下一个BroadcastReceiver,通过getResult系列函数来取得上个BroadcastReceiver返回的结果,并可以abort系列函数来让系统丢弃该广播,使用该广播不再传送到别的BroadcastReceiver。
可以通过在intent-filter中设置android:priority属性来设置receiver的优先级,优先级相同的receiver其执行顺序不确定。
如果BroadcastReceiver是代码中注册的话,且其intent-filter拥有相同android:priority属性的话,先注册的将先收到广播。
有序广播,即从优先级别最高的广播接收器开始接收,接收完了如果没有丢弃,就下传给下一个次高优先级别的广播接收器进行处理,依次类推,直到最后。如果多个应用程序设置的优先级别相同,则谁先注册的广播,谁就可以优先接收到广播。
这里接收短信的广播是有序广播,因此可以设置你自己的广播接收器的级别高于系统原来的级别,就可以拦截短信,并且不存收件箱,也不会有来信提示音。
实现方法是:
<receiver Android:name=".SmsReceiver">
<intent-filter android:priority="100">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
里面的android:priority="100"就是设定广播接收器的级别,这个值从1000~-1000,数值越大,优先级别就越高。
希望帮助到你~~感谢采纳
‘叁’ 如何查看Android系统当前发送了什么广播
要注册接受广播的处理程序,有两种方式在AndroidManifest.xml重注册,比如监听系统的开机广播和屏幕解锁广播这样,一旦有定义的action发出来,BootCompletedReceiver的onReceive方法就会回调了,这样的监听,不需要你的app已经在运行。2.在程序中动态创建监听器,比如还是解锁广播,在Activity的onCreate()中生成一个IntentFilter对象IntentFilterfilter=newIntentFilter();//为IntentFilter添加一个Actionfilter.addAction("android.intent.action.USER_PRESENT");bootCompletedReceiver=newUserPresentReceiver();registerReceiver(smsReceiver,filter);在onDestroy的时候去注册unregisterReceiver(bootCompletedReceiver);这样的方式只有在Activity生命周期onCreate()-onDestroy()之间有效。对于一些特俗的系统级别的广播,即使你按照上面的任何一种方式做了,也可能监听不到,这是android系统做了保护了,网上查一下就知道了。