zoukankan      html  css  js  c++  java
  • 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 会被调用多次
        
  • 相关阅读:
    面试题练习
    小作业7
    小作业6,7
    小作业
    坦克大战
    面试题
    20181213作业
    20181212作业
    20181211作业
    第三周周末作业
  • 原文地址:https://www.cnblogs.com/andy-songwei/p/7219065.html
Copyright © 2011-2022 走看看