MediaProvider 的实质是 Android 的 Core Applications 之一,和 Market 的 app 一样,并无神秘之处,其重要性就是提供了对 media 的操作,而刨根究底,这一操作正是通过同名类 MediaProvider 来实现的。

查阅该类源码,规模不小,再加以纠缠着内部类,第一眼很容易发懵,耐下性子整理出类图如下。正所谓“一个好汉三个帮”,单打独斗固然可以呈现出盖世英雄之势,但是若能团结众人,融合各方能力则能成就一番霸业。史书上的股市是这样,软件开发也如此,大到一个软件产品需要团队来开发,小到一个细微功能也是需要若干相关类来协同。此间利害可以由类图一目了然。


MediaProvider Class Diagram

Android 在数据存储方面给出了四个建议,其中 Database 和 Preferences 用处最广,而 MediaProvider 正是采用了 Database 保存 media 的信息。在 Android 中,凡出现 SQLite 的地方,几乎就可以找到 SQLiteOpenHelper 的影子,在 MediaProvider 中一样如此。根据 Reference 的介绍可以知道该类的用途:

this class takes care of opening the database if it exists, creating it if it does not, and upgrading it as necessary

从类图中可以看到其结果比较简单,onCreate 和 onUpgrade 执行创建和升级的操作,显得较为简单,相较之下 onOpen 方法就要复杂一下。首先要明白该方法的目的是什么。通过注释可以知道其做两件事情,第一是更新数据库文件的修改时间,第二是删除多余的、旧的数据库。

此处的删除操作,为的是“垃圾回收”,以便让出存储空间。那么究竟什么是“旧”?什么是多余?这里须依照一个策略,那就是 LRU,LRU 是 Least Recently Uesd 的简写,通过该策略将两个月内未访问的数据库一概清除,执行完以后再判断剩下的数据库个数是否超出了限制,–Android 为每个外部存储设备建立一个独立的数据库,即 SDCard A 的信息是保存在一个数据库,SDCard B 则是保存在另一个数据库。如果超出限制,则从这些数据库中找出时间最早的一个,删除它,然后继续循环。

这里需要提醒一点,不管怎么删除数据库,内部存储对应的数据库是不删除的,–因为外部存储可能经常被用户插拔不同的 SDCard,而内部存储则是不会被替换的。

更多相关文章

  1. 如何实现android button事件?
  2. Android实现可使用自定义透明Dialog样式的Activity完整实例
  3. Android(安卓)操作数据库Sqlite,数据写入到SD卡里面
  4. Android中的状态机(续)
  5. Android(安卓)Studio使用Git管理分支,合并分支
  6. android 对sqlite数据库的增删改查
  7. Android之工程目录介绍
  8. Android——(SQLite数据库)ListView控件之商品展示案例
  9. android(基于监听)的事件处理

随机推荐

  1. 【Android高级】Android系统以及Activity
  2. 关于Android这个名字。。。
  3. 为Android(和其他移动平台)安装MoSync
  4. android热更新
  5. Android(安卓)View 绘制刷新流程分析
  6. android (java) 网络发送get/post请求参
  7. Android SDK 2.2 开发环境详解
  8. Android(安卓)Webview组件使用总结
  9. Android JNI开发入门之二(javah命令的补
  10. 菜鸟多了我们就有价值了,Android开发没前