Sdcard插拔、状态广播监听,Android文件系统,Android存储器相关知识总结

一 SDcard广播监听,注册,取消注册的实现

   (1)根据实际需要监听的事件,添加action,并注册,一般在onCreate中添加

  //在IntentFilter中选择你要监听的行为
IntentFilter intentFilter = new IntentFilter();
intentFilter.setPriority(1000);// 设置最高优先级
//插入SD卡并且已正确安装(识别)时发出的广播。广播:扩展介质被插入,而且已经被挂载。
intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
//已拔掉外部大容量储存设备发出的广播(比如SD卡,或移动硬盘),不管有没有正确卸载都会发出此广播;广播:用户欲卸载SD卡,但是SD卡上的部分内容尚处于打开状态(准备拔掉扩展卡,物理拔除)
intentFilter.addAction(Intent.ACTION_MEDIA_EJECT);
//广播:扩展介质存在,但是还没有被挂载 (mount)
intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
//外部储存设备已被移除,不管有没正确卸载,都会发出此广播。广播:扩展介质被移除(已经物理拔除)
intentFilter.addAction(Intent.ACTION_MEDIA_REMOVED);
//广播:扩展介质的挂载被解除 (unmount),因为它已经作为 USB 大容量存储被共享
intentFilter.addAction(Intent.ACTION_MEDIA_SHARED);
//未正确移除SD卡(正确移除SD卡的方法:设置--SD卡和设备内存--卸载SD卡),但已把SD卡取出来时发出的广播
//广播:扩展介质(扩展卡)已经从 SD 卡插槽拔出,但是挂载点 (mount point) 还没解除 (unmount)
intentFilter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);
//广播:开始扫描介质的一个目录
intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
//广播:已经扫描完介质的一个目录
intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
//按下"Media Button" 按键时发出的广播,假如有"Media Button"按键的话(硬件按键)
intentFilter.addAction(Intent.ACTION_MEDIA_BUTTON);//
//插入外部储存装置,比如SD卡时,系统会检验SD卡,此时发出的广播
intentFilter.addAction(Intent.ACTION_MEDIA_CHECKING);
//拓展介质存在,但使用不兼容FS(或为空)的路径安装点检查介质包含在Intent.mData领域。
intentFilter.addAction(Intent.ACTION_MEDIA_NOFS);//
//检测没有问题,将扫描单个文件
intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
//表示SD卡存在,但是无法挂载
intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTABLE);
intentFilter.addDataScheme("file");
registerReceiver(broadcastRec, intentFilter);//注册监听函数
(2)实例化一个广播实例
  private final BroadcastReceiver broadcastRec = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.i(TAG, "action=" + action);
}
};
(3)注销广播 unregisterReceiver(broadcastRec); 一般在OnDestory()方法中完成  
(4)系统源码action值对应关系
ACTION_MEDIA_BAD_REMOVAL = "android.intent.action.MEDIA_BAD_REMOVAL";
ACTION_MEDIA_BUTTON = "android.intent.action.MEDIA_BUTTON";
ACTION_MEDIA_CHECKING = "android.intent.action.MEDIA_CHECKING";
ACTION_MEDIA_EJECT = "android.intent.action.MEDIA_EJECT";
ACTION_MEDIA_MOUNTED = "android.intent.action.MEDIA_MOUNTED";
ACTION_MEDIA_NOFS = "android.intent.action.MEDIA_NOFS";
ACTION_MEDIA_REMOVED = "android.intent.action.MEDIA_REMOVED";
ACTION_MEDIA_SCANNER_FINISHED = "android.intent.action.MEDIA_SCANNER_FINISHED
ACTION_MEDIA_SCANNER_SCAN_FILE = "android.intent.action.MEDIA_SCANNER_SCAN_FI
ACTION_MEDIA_SCANNER_STARTED = "android.intent.action.MEDIA_SCANNER_STARTED";
ACTION_MEDIA_SHARED = "android.intent.action.MEDIA_SHARED";
ACTION_MEDIA_UNMOUNTABLE = "android.intent.action.MEDIA_UNMOUNTABLE";
ACTION_MEDIA_UNMOUNTED = "android.intent.action.MEDIA_UNMOUNTED";

二 SDcard不同操作情况下的广播事件
(1)插入SDcard
MEDIA_CHECKING --> MEDIA_MOUNTED --> MEDIA_SCANNER_STARTED --> MEDIA_SCANNER_FINISHED
(2)物理拔除SDcard
MEDIA_EJECT --> MEDIA_EJECT(不清楚为什么会发出两次该广播,但测试时确实如此) --> MEDIA_SCANNER_STARTED(后面会多次调用) --> MEDIA_SCANNER_FINISHED
--> MEDIA_SCANNER_STARTED --> MEDIA_UNMOUNTED --> MEDIA_BAD_REMOVAL --> MEDIA_SCANNER_FINISHED --> MEDIA_SCANNER_STARTED --> MEDIA_SCANNER_FINISHED
说明:① MEDIA_EJECT 不清楚为什么会发出两次该广播,但测试时确实如此
② MEDIA_SCANNER_STARTED 和 MEDIA_SCANNER_FINISHED 会被调用多次
    
原文地址:https://www.cnblogs.com/andy-songwei/p/7219065.html