您的位置:首页 > 产品设计 > UI/UE

android4.4的文件管理器documentsui源码解析

2016-02-18 17:31 489 查看


泡在网上的日子 发表于2014-08-23 11:55, 第 4567 次阅读 文件

摘要 本文主要多android4.4中出现的documentsui理出一条分析的线索。从源码的角度做一些简单的分析。在4.4以上的版本中如果通过如下的Intent调用Activity:
则会自动调用系统自带的documentsui文件管理器。因为documentsui的manifest中没有带category等于category.LAUNCHER的属性,因此documentsui是不会显示在LAUNCHER桌面上的。documentsui的界面如下:为了研究在android中资源文件是如何访问的的,我决定研究一下其代码。源代码地址https://github.com/OWLeeMod/android_packages_apps_DocumentsUI将代码下载下来之后,发现起代码结构非常复杂,这篇文章只是一个初步的分析。入口:DocumentsActivity。DocumentsActivity的布局是由DrawerLayout构成的,左边是文件类别的菜单,右边是相应的目录树。onCreate方法中:
其中有个判断条件是
mState.action == ACTION_GET_CONTENT
表示调用documentsui的人想获得的是文件系统的内容,也就是说本文开始那样的调用方式将会转到这个条件中来,执行
中的代码。本文也主要是围绕documentsui的这一功能来分析的。除此之外从上面的代码还可以看出documentsui还有些其他的功能对应的是
ACTION_CREATE,
ACTION_MANAGE等,目前不清楚这些功能具体做什么。
[code]回到
mState.action == ACTION_GET_CONTENT
这个条件中,他调用了[code]RootsFragment
中的show方法:[/code]
可以看出这是为了显示
RootsFragment
自己,其实
RootsFragment
就是DrawerLayout的菜单部分。点击某个菜单之后(如图片)右边的目录树做相应的切换,那么这个过程是如何进行的呢?在
RootsFragment
中,菜单列表是一个ListView当然点击菜单就会进入到listvIew的
OnItemClickListener
中:
我们注意上面的界面图,可以看到左边菜单不仅仅有关于文件类型的,还有可以选择应用程序的。因此点击菜单之后上面的代码首先判断了你点击的
RootItem
类型,这里我们不去研究用户点击应用程序的情况。当用户点击的是文件类型(如图片)菜单,则会调用
DocumentsActivity
的onRootPicked:[/code]
这里又有一个条件分支,判断了是否是“最近”菜单(
isRecentsRoot
,注意比照上面的界面图),如果是则执行[code]
new
PickRootTask(root).executeOnExecutor(getCurrentExecutor());
不是则调用
onCurrentDirectoryChanged
方法。因为分支过多我只研究最基本的,也就是列出目录文件的功能所以忽略“最近”菜单被点击的情况,进入到
onCurrentDirectoryChanged
中(其实反之最终也还是要进入到onCurrentDirectoryChanged中),很烦的是
onCurrentDirectoryChanged
中又有很多分支情况,但可以肯定的是
列出目录文件的功能
是调用
DirectoryFragment.showNormal(fm, root, cwd, anim);
完成的。所以我的重点就在
DirectoryFragment
这个类中了。
我想了解在
DirectoryFragment
中是如何列出文件和目录 同时是如何显示缩略图的。
DirectoryFragment
是使用loader机制来加载内容的。
getLoaderManager().restartLoader(mLoaderId, null, mCallbacks);
其中
mCallbacks
如下:
其中很重要的是启用了DirectoryLoader类。DirectoryLoader完成了目录的加载。本文不对其深入讲解。当loader加载完成(
onLoadFinished
)会将结果
result
传递给
mAdapter
mAdapter.swapResult(result),这个result的类型是
DirectoryResult
。上面说了我想知道文件或者目录的缩略图是如何加载的,所以需要了解这个[code]
mAdapter
的内部情况。[/code]
mAdapter的声明如下:
private DocumentsAdapter mAdapter;
DocumentsAdapter 是
DirectoryFragment
的一个内部类,我直接跳到他的getview方法:[code]
貌似没什么东西,继续跟着跳到
getDocumentView
,其中有这样的一段代码:
缩略图获得的过程是:首先从
thumbs
这个ThumbnailCache中获取缓存图片,定义如下
如果缓存中没找到,则开启
ThumbnailAsyncTask
。然后再继续分析
ThumbnailAsyncTask
吧 总之这是一个很繁琐的过程。本文只是理出一条分析的线索,希望对大家还是有所帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: