负责这个模块后第一步就是静态分析。
首先看 AndroidManifest.xml里面的内容。首先看的是包名
com.cooliris.media
看过其他模块的人都会发现,其他都是com.android.***的包名,这个包名有点怪,因为这个是一个叫做cooliris的公司写的应用。 然后我们看下源代码里面的目录,有5个目录,分别是
应用启动
图片缓存
主要功能
毕加索
墙纸
对应5个包,对应的功能暂时先看着,后面再理解。回过头继续看AndroidManifest.xml里面的内容。
接着是权限,注意权限是在Application前面加的。
SET_WALLPAPER 设置墙纸权限
WRITE_EXTERNAL_STORAGE 读取T卡权限
MANAGE_ACCOUNTS 获取和管理帐户权限
WRITE_SYNC_SETTINGS READ_SYNC_SETTINGS 读写同步设置
WAKE_LOCK VIBRATE 唤醒锁和震动权限
INTERNET 互联网访问权限
USE_CREDENTIALS 当前用户授权使用证书请求
ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION 允许程序访问精确位置
在看所有声明的activity:
com.cooliris.media.Gallery
com.cooliris.media.CropImage
com.cooliris.media.MovieView
com.cooliris.media.Photographs
com.cooliris.media.PhotoAppWidgetConfigure
com.cooliris.media.PhotoAppWidgetBind
声明的provider:
com.cooliris.picasa.PicasaContentProvider
声明的service:
com.cooliris.picasa.PicasaService
com.cooliris.cache.CacheService
声明的receiver:
com.cooliris.cache.BootReceiver
BOOT_COMPLETE
MEDIA_SCANNER_FINISHED
MEDIA_MOUNTED
MEDIA_EJECT
com.cooliris.media.PhotoAppWidgetProvider APPWIDGET_UPDATE
com.cooliris.picasa.PicasaReceiver LOGIN_ACCOUNTS_CHANGED_ACTION
activity数量不多,但并不简单,我们顺着流程看,先看下receiver,这些是应用还没有开启就开始运行的部分。
首先是com.cooliris.cache.BootReceiver,这个是在四种情况下都会启动的Receiver,开机启动,媒体扫描完毕,媒体挂载上,媒体卸载时。
@Override public void onReceive(final Context context, Intent intent) { final String action = intent.getAction(); Log.i(TAG, "Got intent with action " + action); if (Intent.ACTION_MEDIA_SCANNER_FINISHED.equals(action)) { ; } else if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) { ; } else if (action.equals(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)) { final Uri fileUri = intent.getData(); final long bucketId = Utils.getBucketIdFromUri(context.getContentResolver(), fileUri); if (!CacheService.isPresentInCache(bucketId)) { CacheService.markDirty(); } } else if (action.equals(Intent.ACTION_MEDIA_EJECT)) { LocalDataSource.sThumbnailCache.close(); LocalDataSource.sThumbnailCacheVideo.close(); PicasaDataSource.sThumbnailCache.close(); CacheService.sAlbumCache.close(); CacheService.sMetaAlbumCache.close(); CacheService.sSkipThumbnailIds.flush(); } }
只有两个地方的处理:
ACTION_MEDIA_SCANNER_SCAN_FILE
当有人要求我们扫描指定文件或者目录时,我们要做的事情。首先是从Intent中取得要扫描的位置,然后看前面是否已经扫描过了,如果没有扫描过,设置为脏地方,因为Receiver不能做长时间的扫描动作,后面有专门的代码来扫描。
那么在xml中并没有注册这个ACTION_MEDIA_SCANNER_SCAN_FILE,到底是谁发出的这个信息呢?而且这里只有接受到并没有处理,到底是哪里处理的呢?我们下次在讲。
ACTION_MEDIA_EJECT
在媒体卸载时,将本地数据源的图片缩略图缓存关闭,将本地视频缩略图缓存关闭,毕加索数据源的缩略图缓存关闭,缓存服务的三个Cache源也关闭。
数据源时什么意思呢?可以理解为图片和视频的集合。
关闭数据源时什么意思呢? 将图片和视频的集合的索引写到一个叫做“DiskCache”的临时文件中。下次用户还是用这个数据源,就可以直接使用索引。