如有错漏请不吝拍砖指正,转载请注明出处,非常感谢
有一个问题,在网上被频繁的问到,就是为什么自定义的Receiver总是无法接收到SD卡插拔的事件。
而此问题大部分情况下可以通过增加一句代码解决: filter.addDataScheme("file"); // filter是IntentFilter对象
那么为什么增加这句代码就可以解决了呢?这个问题尽管有人问到,但是却没有太好的回答。
可能是因为对于精通IntentFilter策略的高手们来说,这根本算不上问题,是一个再明显不过的事实而已。
而对于不太了解IntentFilter策略的我们初学者来说,这个问题又暂时有点太难以理解吧。
因此,本文试着通过对android的事件过滤策略进行介绍和分析,结合示例程序进行验证,
来解答此问题,并浅显的介绍android事件过滤策略。
1. 编写示例程序,创建一个自定义的BroadcastReceiver
首先我们创建一个android工程起名为SdCardTester,作为示例程序。
为了方便在后续步骤中模拟SD卡插拔,建议将目标平台设定为2.3版本,使用2.3版本的模拟器。
此外务必注意,运行此示例程序的AVD模拟器需要增加SD卡功能支持。
然后为SdCardTester类增加一个BroadcastReceiver类型的成员变量 mReceiver。
在onCreate中,使用匿名类的技巧,为 mReceiver 赋值一个BroadcastReceiver子类实例。
注意代码中重写的onRecevie函数里只有一句代码,用于记录日志。以证明我们确实收到了事件。
然后创建一个IntentFilter,用于过滤SD卡插拔事件。
最后把我们自定义的Receiver和编写好的IntentFilter注册到系统中
最后的最后不要忘了在onDestory中注销我们的自定义Receiver,
至此完成了示例程序的代码编写,SdCardTester的完整代码如下: