基于Android系统的手机文件管理器的设计与实现
2012-11-26周荣辉
陈 煜,周荣辉
(西南交通大学 信息科学与技术学院,成都 610031)
在移动终端技术与互联网不断发展与融合的今天,手机已从简单的通话工具发展为集PDA、互动游戏、高分辨率摄像、移动视听于一体的全功能通信、数据处理工具,手机上的信息存储量也越来越多。但Android平台自身并不提供资源管理器功能,提供的应用程序接口(API)很简单。因此,需要开发实用的Android手机文件管理器,以满足广大用户对资源管理的需求。
1 系统总体设计
Android是基于Linux 2.6内核的开源手机操作系统,其全面的计算服务和丰富的功能支持,完全有能力扩展到移动电话市场以外,发展前景非常广阔。
1.1 系统架构层次介绍
Android 的系统架构主要分为4层[1],从高到低分别是:(1)由运行在Dalvik 虚拟机上的应用程序组成的应用层;(2)由开发人员可以直接调用的组件所组成的应用框架层;(3)对应用框架层提供支撑的系统运行库层;(4)包括驱动模型、内存管理、进程管理、网络协议栈等组件的Linux内核层,它依赖于 Linux 2.6 内核,也同时作为硬件和软件栈之间的抽象层。根文件系统使用rootfs,数据及文件使用yaffs2,是专门为NAND和NOR存储器设计驱动的文件系统。文件管理器在整个Android系统架构中的层次如图1。
图1 文件管理器在整个系统中的架构层次
1.2 文件管理器的功能及开发环境
类似于PC中的资源管理器,为实现用户对于手机文件资源管理的需求,手机文件管理器需要实现的功能主要有文件系统浏览,目录跳转,对文件执行复制、移动等文件管理操作,调用其他应用对特定文件执行相关操作,文件搜索,文件管理器参数设置及其它设置桌面快捷方式、设置铃声等辅助功能。文件管理器的手机用户用例图如图2。
图2 手机用户用例图
本应用基于Android SDK 2.1 平台,以Eclipse为集成开发环境,选择Android上层应用开发通用的Java语言,通过Android SDK自带的adb工具和emulator模拟器实现程序的调试和运行。
2 系统功能的设计与实现
2.1 文件管理器Activity的设计
根据系统的功能需求,文件管理器主要由3个界面组成,它们分别是作为应用主界面的FilerActivity、进行参数设置的FilerPreferences-Activity以及进行文件搜索的SearchActivity。
listview 是Android开发中最常用的组件之一,它通过一个适配器(adapter)以列表项的形式显示指定的数据,通过使FilerActivity继承自ListActivity,可以满足用户方便直观地浏览Android文件系统内容的要求。适配器是用来把数据映射到listview上的中介,通过setListAdapter()函数可以实现当前listview与指定适配器的联系。为了更灵活地实现本应用中界面的自定义效果,在FilerActivity活动中定义一个继承自Android.ArrayAdapter的适配器FileListAdapter,在其中的构造函数中指定主界面listview中每一行布局的xml文件,同时新建getView()函数以覆盖父类中的同名函数,在其中实现布局id与指定资源数据的绑定,使主界面上显示达到的效果。
通过对Android listview的分析可以发现[2],listview的显示是以行为单位进行的,而整个屏幕列表项的显示是由RelativeLayout.onLayout()函数中的for循环来控制实现的。在一次循环的执行过程中,会依次调用ListView.makeAndAddView()、AbsListView.obtainView()、Adapter.getView()等函数,最后调用执行文件管理器程序中自定义的getView()函数,覆盖了父类listview中布局id与资源文件的绑定操作,这也是在程序开发中重写适配器及getView()函数的目的,如图3。
图3 listview创建过程中的函数调用关系
在应用实现中,无论是文件系统不同目录之间的跳转,还是从其他界面的返回,或是对SD卡状态的动态响应,都需要及时刷新文件管理器界面,同样也会多次间接地调用自定义的getView()函数。如前所述,listview通过for循环完成当前界面上多个view的填充操作后,随着一些后续工作的完成,就可以看到文件系统中当前目录下的内容,如图4。文件管理器此时进入消息循环状态,用户可能的下一步操作及对应的处理函数如表1。
选项菜单(OptionsMenu)和上下文菜单(ContextMenu)是Android开发中最常见的元素,为某些操作提供了合适的入口。开发人员只需预先设计好相应的菜单选项,以xml文件的形式存放,在随后执行系统回调函数的过程中进行有选择的显示菜单项即可。相比而言,ContextMenu更适合设置一些与单个view项操作相关的菜单项,OptionsMenu适合设置一些与整体相关的选项。在这里,可以把文件重命名、查看属性、设置铃声等操作放在ContextMenu中实现,而搜索文件、排序设置等操作就由OptionsMenu来完成。
图4 文件管理器主界面效果图
表1 用户的界面操作与对应的处理函数
在Android本身的实现中,大量用到了PreferenceActivity对系统进行信息配置和管理。文件管理器的开发中,也同样使用FilerPreferences-Activity为用户提供参数设置的接口。它的布局文件放在固定的路径res/xml下。由FileActivity中OptionsMenu中的一个菜单项来启动。
另外,文件管理器还提供了文件搜索的功能,即能够根据关键字依次匹配指定目录下的文件/文件夹名称,并以列表形式显示出搜索的结果,该功能由SearchActivity来实现。Android的搜索功能能够帮助开发者很好地管理搜索对话框,使开发人员不需要自己去开发一个搜索框,不需要考虑把搜索框放在什么位置、搜索框是否会影响当前的界面等不重要的细节问题,所有这些工作都由搜索管理器(SearchManager)来辅助实现。当在Android搜索栏中输入关键字执行搜索操作时,搜索管理器将使用一个专门的Intent“android.intent.action.SEARCH”,将它传给在配置文件Android-Manifest.xml中声明的处理搜索结果的activity,即本应用中的SearchActivity。通过get-Intent().getStringExtra()函数即可获得用户输入的关键字,然后按关键字执行搜索操作,并以列表形式显示出得到的结果。在程序中建立了int类型的变量mFileNumber来记录已找到搜索目标个数,用ArrayList
图5 文件搜索过程流程图
2.2 各应用界面之间的转换
Android应用开发中,每一个界面即对应着一个activity。用户在使用手机软件时,需要在不同的界面之间来回转换。相对应的程序中的每一个activity都有开始和结束的过程。
可以在配置文件AndroidManifest.xml中声明应用包含的所有活动及每个活动所要响应的intent,然后在程序中需要的地方用startActivity()函数向系统发送指定的intent,由系统启动合适的活动响应intent。在程序中,用Activity.finish()函数结束当前活动,由活动管理器(Activity Mana-ger)确定下一个进程的到来。在文件管理器的整个应用中,各个activity之间的转换如图6。步操作。
图7 文件复制操作时序图
表2 程序调用文件管理的主要系统函数
另外,在设计中,还应该把对文件进行处理的过程放在一个新建的子线程中执行,以取得较好的界面显示效果。
控制部分的文件复制操作时序图如图7。
图6 应用中各个activity之间的转换
2.3 文件管理功能的实现
本应用要实现的文件管理功能主要有单个或批量文件的移动、复制、重命名等操作。针对应用的具体情况,在界面底部建立了一个工具栏(包括yankbar、copybar、movebar),配合listview中各行的icon按钮,更方便地完成对文件管理的大部分操作。
MVC(Model-View-Controller)是当前比较流行的软件开发框架,它的思想与观察者模式类似。Android项目整体就是一种典型的MVC结构,其中广泛使用的xml布局文件即是view,activity和intent,起到了控制器的作用,提供者对数据层做了良好的封装,而且提供者把数据管理的范畴从数据库泛化到了数据的概念[3]。通过使用MVC模式,可以使文件管理器的界面设计工作和文件系统相关处理操作相互独立,让界面的设计更加灵活,文件管理功能也可以进行模块化的开发。同时也能够使开发人员专心处理前端界面显示与后台文件系统数据之间的关系,设计出高效稳定的程序。
就本应用来说,可以事先单独设计好每个界面布局的xml文件并根据实际情况进行修改和调整,文件的复制、移动等调用系统文件操作函数接口的后台操作就是逻辑模型部分,控制部分表现在各个activity的生命周期中控制应用界面的各种逻辑切换,以及相关数据结构的变化,调用对应的处理函数等。文件管理操作中,控制部分的界面变化比较复杂,如在选取或取消要操作的目标文件、进入新的目录选择文件、在执行复制或移动等操作的过程中、文件管理操作成功或失败的处理并返回等等情况,listview界面及底部的操作工具栏都要随之刷新并正确地显示,指示用户进行下一
在程序中,建立了File类型的全局变量mCur-Dir,存放将要进入或正在显示的目录信息;ArrayList
2.4 应用中相关数据的存储
在文件管理器的数据存储中,使用了Android的3种数据存储方式:SharePreference、SQLite和ContentProvider。
SharePreferenc常用于存储较简单的参数设置,文件管理器中FilerPreferencesActivity活动就是用这种方式,通过preferences.xml文件来持续化应用配置信息的。当应用刚安装好第一次运行时,配置文件为空,使用默认的数据给参数赋值,对应用进行配置,当执行FilerPreferences-Activity活动中的addPreferences-FromResource(R.xml.preferences)后,将在/data/data/chenyu.filemanage.filer/中建立一个以应用包名为前缀的preferences.xml文件,保存应用的配置数据信息,可以通过adb工具查看文件的内容,如图8。
图8 用adb工具查看配置文件内容
在使用文件管理器的过程中,用户可以通过FilerPreferencesActivity的界面对参数设置的内容进行查看或修改。应用在activity退出时对相关的配置信息数据进行提交,保存在preferences.xml文件中,使用户的设置在下次使用应用时依然有效。
文件管理器中使用的SQLite数据库保存的信息为每种类型文件的几个属性(extension,mimetype,icon, action等)的对应关系,数据库文件位于/data/data/chenyu.filemanage.filer/lib中。在应用中主要有2个地方要对数据库进行查询使用。(1)listview的界面显示,虽然每一行view由适配器确定的布局都是一样的,但实现时也要根据不同文件的类型,显示不同的资源标示图片以对不同类型的文件进行区分;(2)在对特定文件执行打开操作时,需要向系统发送包括type、action等参数在内的intent消息,这些信息也都需要查询数据库得到。
文件管理器中已经事先设置了比较多的数据库元组,它涵盖了如今大部分常见的手机文件类型,用户也可以在设置界面中添加或修改对应的文件属性信息。
在SQLite数据库的操作中使用了Content-Provider和ContentResolver,严格来说,它并不是真正的实现数据存储,而是一种提供数据共享及访问的手段。在自定义的继承自ContentProvider的类中封装好了数据库中的数据,同时重新定义了插入、删除、查询等成员函数,对外提供一个公共的统一资源标示符(URI)。其他需要访问数据的地方就可以通过ContentResolver函数,传入这个URI,对数据进行访问。通过研究程序源码可以发现,ContentResolver的数据获取方法,如query(),调用的还是对应ContentProvider的query()方法。而ContentProvider的query()为抽象方法,我们在自定义的子类中已经重写了该成员函数方法,这样,当调用ContentResolver.query()方法时,执行的还是应用中自己写的MimeProvider.query方法。也就是说,我们在定义数据提供者MimeProvider的同时也定义了外界访问这个封装数据集的接口,只不过这些已定义访问的方法是由Content-Resolver的成员函数间接调用而已。
3 结束语
本文从实际应用出发,设计了一款实用、高效的手机文件管理器。通过灵活运用Android开发的相关技术,成功解决了实现过程中遇到的技术问题,也为同类Android应用开发提供了较好的参考。Android的开源为开发人员解决各种问题提供了极大的方便,随着手机厂商不断的加入Android阵营和用户使用量的日益增多,Android应用开发的明天将会更加美好。
[1]杨丰盛. Android技术内幕:系统卷[M]. 北京:机械工业出版社,2011.
[2]Fan Jiang, Shaoping Ku.How to Display the Data from Database by ListView on Android[C]. 2nd International Workshop on Intelligent Systems and Applications, 2010:1-4.
[3]Hyun Jung La,Soo Dong Kim.Balanced MVC Architecture for Developing Service-Based Mobile Applications[C].7th International Conference on e-Business Engineering , 2010:292-299.
[4]王世江,余志龙,陈昱勋,郑名杰. Google Android SDK开发范例大全[M]. 2版 北京:人民邮电出版社,2010.