浅析Android MediaProvider之一

来源:互联网 发布:温州公安网络 编辑:程序博客网 时间:2024/06/06 00:14
转载自: http://blog.csdn.net/qikaibinglan/article/details/6129461

pic02pic01这段时间,我得一机会对 Android MediaProvider 进行了一番探究,奈何功力有限,不足以参悟其全部,简单记录下心得,已做“到此一游”之用。

认识新鲜事物,忌讳一头沉入细节,只见树木不见森林,宜先远远的看,从制高点一览全局,正所谓高屋建瓴。从事 Web Application 的时候,Web.xml可以帮助建立对系统运作流程的理解,对于 Android Application,则一样需要先找到这么一个制高点,这个制高点就是 AndroidManifest.xml。

统揽 AndroidManifest.xml,可以了解其由三个基础组件构成,分别是负责向外界提供数据访问的 MediaProvider,监听事件的 MediaScannerReceiver 和 实施扫描的 MediaScannerService。捏柿子要挑软的捏,看代码就挑短的先看,以免长篇累牍的代码让自己望而生畏,立马退避三舍,从代码量来看 MediaScannerReceiver 最小,这里就最先从 MediaScannerReceiver 来开始剖析。

简单梳理一下代码结构,整理出 MediaScannerReceiver 的类图如下,结合 AndroidManifest.xml 可以知道,在onReceive() 中,可以接收到三类 Intent,分别是:


MediaScannerReceiver
android.intent.action.BOOT_COMPLETED
android.intent.action.MEDIA_MOUNTED
android.intent.action.MEDIA_SCANNER_SCAN_FILE

这三个 Intent 均可以从 android.content.Intent 查看到定义,前两者顾名思义,比较好理解。第三个稍显复杂,据文档介绍其是请求 media scanner 扫描文件,并把它加入到 media database里,– 文件的路径就包含在 Intent.mData 中。

查看代码执行流程,可以发现对于第三个 Intent ,最后是进入到 scanFile,而前两者则是进入到scan,不同是是一个 internal,一个则是 external。但是最后殊途同归,统统进入到 MediaScannerService 处理。想来 BroadcastReceiver 也就是做个“传令官”的角色,所作的事情不多。

进入到 MediaScannerService 之后,根据其代码结构可整理出其类图如下。


MediaScannerService

乍一看,对于 MediaScannerService 实现 Runnable 感到不解,为什么要实现线程接口?为什么又要实现一个 Handler 的子类呢?这两者之间又是由着什么样的关系呢?

要理清第一个问题,需要从一行注释看起,在 onCreate 方法中看以这样的内容:

Start up the thread running the service. Note that we create a separate thread because the service normally runs in the process’s main thread, which we don’t want to block.

由此可以得知,实现 Runnable 的初衷是为了把扫描操作的动作放到主线程之外的线程上运行,因为如果是在主线程上运行扫描,那么最糟糕的结果就是阻塞了主线程。而根据 Handler 的文档,我们可以知道:

When a process is created for your application, its main thread is dedicated to running a message queue that takes care of managing the top-level application objects (activities, broadcast receivers, etc) and any windows they create.

主线程一旦阻塞,那么响应用户的动作就会非常缓慢,就会出现 ANR。但是在自己创建的线程上如何同主线程进行通信呢,这就需要使用到 Handler。根据 document 的解释,Handler 的用途有二:

(1) to schedule messages and runnables to be executed as some point in the future; and (2) to enqueue an action to be performed on a different thread than your own.

这里我们显然是用到了第二个用途。到此第二个问题也就可以解释得通了。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 暴雪忘了密码换了手机号怎么办 华为荣耀10看电视缓冲太慢怎么办 交易猫梦幻西游手游恶意仲裁怎么办 银色高跟鞋前面尖尖蹭掉色了怎么办 苹果账号邮箱和密码都忘了怎么办 网易云密码忘记了怎么办手机号换了 超市买过期东西但没有小票怎么办 网购退货商家已收货而不退款怎么办 手机号被别人注册了京东怎么办 中通快递把我发的货弄坏了了怎么办 在淘宝获取不了丰巢柜提货码怎么办 京东快递提货码数手机号错了怎么办 腾讯手游助手不能玩刺激战场怎么办 刚收的京东快递质量有问题怎么办 拼多多买家接受信息没有声音怎么办 苹果6s外放声音有杂音怎么办 华为手机不小心把视频删了怎么办 电脑做完系统不显示声卡了怎么办 苹果手机自带浏览器看视频卡怎么办 pr剪辑的时候视频太卡怎么办 小米手机忘记登录账号密码了怎么办 石膏线条软模硅胶模具气泡多怎么办 京东白条开通失败怎么办金牌用户 买家说我运费险没赔要投诉我怎么办 包邮有运费险的东西想退货怎么办 高锰酸钾沾到龟头上形成黑点怎么办 淘宝发货包邮买家退款运费怎么办 京东实名认证的手机号不用了怎么办 淘宝退货在自提柜 卖家不取怎么办 如果买家退货那卖家送的东西怎么办 陆金所注册手机号被占用要怎么办 重新登录而忘记密码和验证码怎么办 手机清理垃圾清掉的照片怎么办 收件人名字写错了拿不到快递怎么办 档案回原籍收件人写错了怎么办 寄申通快递收件人电话写错了怎么办 第三方支付倒闭了用户的钱怎么办啊 京东配送日期内货没送到家怎么办 拼多多拼单不成功优惠券退吗怎么办 退货退错了不发回来怎么办 商家总是不发退货地址过来怎么办