通过addDataScheme file 浅析android事件过滤策略

本文通过一个示例程序分析了Android中SD卡插拔事件的过滤策略,揭示了为什么需要在IntentFilter中添加`filter.addDataScheme("file")`才能捕获到SD卡事件。文章详细介绍了事件(Intent)的分类、事件过滤策略、IntentFilter的工作原理,并通过日志输出分析了SD卡插拔事件的action、data、category等内容,最后解释了data匹配规则和SD卡事件的匹配过程。
摘要由CSDN通过智能技术生成
               

有一个问题,在网上被频繁的问到,就是为什么自定义的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子类实例。

  1.      mReceiver =new BroadcastReceiver() { 
  2. @Override 
  3. publicvoid onReceive(Context context, Intent intent) { 
  4.         Log.i("myLoger"," Receive SDCard Mount/UnMount!"); 

注意代码中重写的onRecevie函数里只有一句代码,用于记录日志。以证明我们确实收到了事件。

然后创建一个IntentFilter,用于过滤SD卡插拔事件。

最后把我们自定义的Receiver和编写好的IntentFilter注册到系统中

  1. IntentFilter filter =new IntentFilter(); 
  2. filter.addAction(Intent.ACTION_MEDIA_MOUNTED); 
  3. filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); 
  4. registerReceiver(mReceiver, filter); 

最后的最后不要忘了在onDestory中注销我们的自定义Receiver,

至此完成了示例程序的代码编写,SdCardTester的完整代码如下:

  1. package com.silenceburn; 
  2.  
  3. import android.app.Activity; 
  4. import android.content.BroadcastReceiver; 
  5. import android.content.Context; 
  6. import android.content.Intent; 
  7. import android.content.IntentFilter; 
  8. import android.os.Bundle; 
  9. import android.util.Log; 
  10.  
  11. publicclass SdCardTesterextends Activity { 
  12.      
  13.     BroadcastReceiver mReceiver; 
  14.      
  15.     /** Called when the activity is first created. */ 
  16.     @Override 
  17.     public void onCreate(Bundle savedInstanceState) { 
  18.        super.onCreate(savedInstanceState); 
  19.         setContentView(R.layout.main); 
  20.          
  21.         mReceiver =new BroadcastReceiver() { 
  22.            @Override 
  23.            public void onReceive(Context context, Intent intent) { 
  24.                     Log.i("myLoger",
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值