第一篇:安卓目录总结
原装软件: AccountAndSyncSettings.apk.........账户与同步设置 AIMail_Android_V332a.apk.........手机邮箱 ApplicationsProvider.apk...........应用程序支持服务 BaiduSeach-v1.0.3.32_643e.apk.....百度快搜 Balance_ball_V128.apk.....平衡滚球 Bluetooth.apk...............蓝牙 Bowling_V116.apk.....保龄球对战 Browser.apk..........浏览器 Calculator.apk..............计算器 Calendar.apk................日程表 CalendarProvider.apk........日程表存储 Camera.apk...........相机 CertInstaller.apk...........证书安装 CIT.apk..............用户接口测试 ClockSet.apk................时钟 Contacts.apk................联系人 ContactsProvider.apk........联系人存储 Conversion.apk..............转换工具 DeviceInfo.apk..............设备信息 Dictionary.apk..............词典 DocViewer_STD...............Polaris 文档阅读器 DownloadProvider.apk........下载管理器 DrmProvider.apk.............受DRM 保护的内容的存储 DrmService.apk..............DRM 保护服务 Email.apk............电子邮件 FileManager.apk.............文件管理器 FilePicker.apk..............选择文件 FMRadio.apk..........收音机 Gallery.apk..........7库 GlobalSearch.apk............快速搜索框 GoogleSearch.apk............谷歌搜索 GPSUI.apk............GPS 界面,用途未知 HTMLViewer.apk..............HTML 查看器 kaixin_1.0.2.apk---开心网 LatinIME.apk................Android 键盘 Launcher.apk................主屏幕 LeMei.apk............乐媒 Lunar.apk............农历 MediaProvider.apk...........媒体存储 Mms.apk..............信息 Mob.apk..............手机营业厅 Motorboat_V110.apk------------------------急速摩托艇 Music.apk............音乐 NotePad.apk..........记本 PackageInstaller.apk........打包安装程序 Palmebool_5_1_03.apk-----------------------爱读掌阅 PekAllIME.apk...............京联云输入法 Phone.apk............拨号器 PhoneLocationProvider.apk..........本地拨号器存储 PicoTts.apk..........语音程序 PinyinIME.apk...............谷歌拼音输入法 ProfileSetting.apk..........情景模式 QQ_K-Touch_W606.apk---------------------手机QQ QQBrowser_W606.apk-----------------------QQ 浏览器 QQLord2009_W606.apk---------------------QQ 斗地主 renren_android_1.5.apk----------------------人人网 ServiceGuide.apk-----------------------------服务指南 Settings.apk................设置 SettingsProvider.apk........设置存储 SetupWizard.apk.............设置向导程序 SogouInput_oem_w606.apk------------------搜狗输入法 SoundRecorder.apk...........录音机 Stk.apk..............USIM 卡应用
Straightflush_SC_VER_7_20_06.apk-------------------同花顺 SuperUser.apk...............授权管理 TelephonyProvider.apk..............拨号器存储 Tetris_V117.apk对战俄罗斯方块 TtsServices.apk.............GoogleTTS 语音库服务 UHotline.apk................联通热线 UserDictionaryProvider.apk.........用户字典 VoiceRecorder.apk...........录音机 V.p.n.Services.apk..........虚拟专用网服务 Weather.apk-天气预报 WeatherWidget----------------------------天气预报桌面小工具 Weibo2.0.4.apk---------------------------新浪微博 Wo.apk...............沃3G WordMemo.apk................背单词 WoStore_v16_v101.apk--------------------------沃商店 其他:
1、.android_secure 是官方app2sd 的产物,删了之后装到sd 卡中的软件就无法使用了
2、.Bluetooth 顾名思义,用蓝牙之后就会有这个。
3、.mobo 顾名思义,Moboplayer 的缓存文件。
4、.QQ 顾名思义,QQ 的缓存文件。
5、.quickoffice 顾名思义,quickoffice 的缓存文件。
6、.switchpro 顾名思义,switchprowidget(多键开关)的缓存文件。
7、.ucdlres 顾名思义,UC 迅雷的缓存文件。
8、albumart 音乐专辑封面的缓存文件夹。
9、albums 相册缩略图的缓存文件夹。
10、Android 比较重要的文件夹,面是一些程序数据,比如google map 的地图缓存。
11、backups 一些备份文件,比如联系人导出到SD 卡时会导入到此文件夹
12、baidu 顾名思义,掌上百度、百度输入法之类程序的缓存文件夹。
13、bugtogo 系统出现问题的时候会形成一些报告文件,存放于此文件夹。"
14、cmp 个人初步判断是音乐的缓存文件夹。
15、data 同样是缓存数据的文件夹,与Android 性质类似。
16、DCIM 相机的缓存文件夹,里面是你照的照片。
17、documents Documents To Go 的相关文件夹。
18、etouch 易行的缓存文件夹。
19、extracted androzip 等解压缩软件默认的解压目录。20、gameloft 顾名思义,gameloft 游戏数据包存放的文件夹。
21、handcent 顾名思义handcent(超级短信)数据文件夹。*
22、handyCurrency 货币汇率相关的文件夹,装了handycalc(科学计算器)之后才会有。
23、ireader 顾名思义,ireader 的缓存文件夹。
24、KingReader 顾名思义,开卷有益的缓存文件夹。
25、LazyList Applanet(黑市场)的缓存目录,也许和其他序也有关,暂时不太清楚。
26、LOST.DIR 卡上丢失或出错的文件会跑这里,此目录无用,删了会自动生成。
27、moji 顾名思义,墨迹天气的缓存目录。
28、MusicFolders poweramp 产生的缓存文件夹。
29、openfeint 顾名思义,openfeint 的缓存文件夹。30、Picstore 图片浏览软件建立的一个目录。
31、Playlists 播放列表的缓存文件夹。
32、renren 顾名思义,人人网客户端的缓存文件夹。
33、screenshot 貌似是截屏图片保存的目录,34、ShootMe 顾名思义,shootme 截屏后图片文件保存的目录。
35、SmartpixGames Smartpix Games 出品游戏的缓存文件夹,比如Jewellust。
36、sogou 顾名思义,搜狗拼音的缓存文件夹。
37、SpeedSoftware RE 文件管理器的缓存文件夹。
38、SystemAppBackup SystemApp remove(深度卸载)备份系统文件后,备份文件保存的目 录。
39、TalkingFriends talking tom(会说话的tom 猫)录制的视频文件所保存的目录。40、Tencent 顾名思义,腾讯软件的缓存目录,比如QQ。(与上面的.QQ 文件夹并不相同)
41、TitaniumBackup 顾名思义,钛备份备份程序锁保存的目录。'
42、TunnyBrowser 感觉是海豚浏览器的缓存目录,但不知道为什么叫这个名字,金枪鱼浏 览器.....43、UCDLFiles UC 迅雷下载文件的保存目录。
44、UCDownloads UC 浏览器下载文件的保存目录。
45、VIE Vignette(晕影相机)的缓存目录。
46、科学上网 顾名思义,科学上网 数据的缓存目录。
47、yd_historys 有道词典搜索历史的缓存目录。
48、yd_speech 有道词典单词发音的缓存目录。
49、youmicache 删掉后还会自动生成,悠米广告的缓存目录,广告程序内嵌在其他程序中。补: 50、Glu Glu 系列游戏的资料包存放地。如3D 猎鹿人等。
51、DunDef 地牢守护者的数据包。
52、KuwoMusic 顾名思义,酷我音乐相关文件夹。
53、MxBrowser 遨游的缓存目录。
54、Camera360 顾名思义,camera360 的缓存目录。
55、TTPod 顾名思义,天天动听的缓存目录。
56、apadqq-images QQ for pad 的缓存目录。
57、My documents 自己手机启用各种程序任务记录文档 定期清除 时间长了会积累 很多 占用SD 卡内存。6 w& J2 g2 H9 H5 y, y
58、.nomedia 手机中隐藏的音频 图片文件夹 可以自设在相关文件夹中。
59、media(媒体文档)使用电话通话录音软件 或在线浏览视频等媒体 产生的音频文件60、带有navi 的是导航软体,一般是地图包 61、.BlueFTP_thumbnails 蓝牙助手的缓存 62、.FileExpert 是文件大师的缓存)63、.quickoffice 是quickoffice 的缓存文件。64、.zdclock 正点闹钟的缓存与记忆 65、365riliDownload 顾名思义就是365 日历的缓存,下载的插件也在里面 66、appmonster2 备份精灵的缓存 67、bcr 名片全能王缓存 68、Camera360 这不用解释了,大家都知道 69、CamScanner 扫描全能王的缓存 70、GOLauncherEX 这大家应该也知道,就是GO 桌面的缓存
71、GOSMS GO 短信 72、Goweather GO 天气 73、MTXX 美图秀秀,制作后的图片缓存 74、ndcommplatform,PandaSpace 这两者都是91 助手生成的缓存 75、notegallery 文本全能王的缓存 76、Photaf 3D 全景拍照的缓存 77、photowonder 魔图精灵生成的缓存 78、soundhound 猎曲奇兵的缓存 79、WhatsApp 这...中文是什么,呵呵,大家都知道吧WhatsApp 的缓存 80、Youdao 有道词典是这文件夹名称,yd_historys,yd_speech 共五个集成在一起 ricwang36(81、SystemAppBackup SystemApp remove(深度卸载)备份系统文件后,备份档桉保存的 目录 82、SpeedSoftware RE 管理器产生的 83、rosie_scroll 坦白说,我一直不知道这个是什么,删了没事,但是还会自动生成,应 该是手机自带哪个软体生成缓存 84、alarms Alarms 闹钟铃声 85、Music MP3 音乐,部分手机才会有 86、notifications 讯息铃声,部分手机才会有 87、ringtones 来电铃声,部分手机才会有 88、.bookmark_thumb1 是手机浏览器可视化我的最爱图片的存放资料夹。
89、.footprints 用于记录手机照片的真实地理位置 90、albumthumbs 照片小图的缓存,为了加快小图的显示速度
第二篇:安卓系统精简总结
[教程] 系统精简总结(集大成者,呵呵)
集大成者, 系统, 精简
本帖最后由 colinma 于 2010-10-26 10:35 编辑
紧接我之前那篇(关于刷不刷机和刷机包的选择),刷机后系统精简的问题。首先,我本着这样一个原则,该精简的,我们用最残忍的方式将他阉割;有用并且好用的一些系统自带程序,能不删掉的尽量留着,这个我会给大家一个参考(说明:删除的时候有对应后缀为.odex的同名文件一并删除)
1.首先,我们要对一些东西毫不犹豫的下黑手。总结了一下论坛各位大侠的帖子,加上我自己切身的体验,这些需要严格取缔的程序如下(system/app/下的):
ChinaUnicomCustomize.apk联通的定制程序包(罪魁祸首)
HWAppMarket.apk智慧云(干脆咱们的安卓市场也改名叫安卓云吧,比这好用数十倍)
HWTheme_Entertainment.apk 手机主题 娱乐
HWTheme_Social.apk手机主题 社交
HWTheme_Work.apk手机主题 工作
(以上三个臭皮匠连0.1个诸葛亮都顶不上)
91pandareade.apk91电子图书
BaiduTiebar.apk百度贴吧
DocumentToGo.apkDataviz的office文件包,未注册
Kingsoft_U8110.apk金山词霸
LuckyMedia_U8110.apk手机乐媒
Readme.apk使用技巧
Renren_Android.apk人人网
SinaWeibo_U8110.apk新浪微博
SinaWidget_U8110.apk新浪新闻
SNSAccount.apk开心网
SNSService.apk开心网服务
SogouInput_U8110.apk搜狗输入法
Tonghuashun_U8110.apk同花顺
UCWEB_U8110.apkUC浏览器
UpdataOnline.apk在线升级
VisualizationWallpapers.apk音乐动态背景壁纸
YouTube.apkYouTube在线视频
(以上都可以在官网或者论坛里找到最新版的下载安装,当然其中一些根本没必要再装,看个人兴趣)
2.下来是一些可删可不删的程序,但建议删除,AccountAndSyncSettings.apk google同步(反正我没打算和他同步,怕一不留神又给大家带来“xx门”)
Browser.apk浏览器(UC肯定比这好用)
Email.apk邮件(尚邮比自带的好用)
Music.apk音乐播放器(天天动听等替代)
SoundRecorder.apk录音软件(论坛里比这好的录音软件很多,功能更强)Camera.apk照相机(Camera360比这效果好,但好像不能录像,要用其他软件)
Maps.apk电子地图(用大侠brut的修改版,支持离线地图的)Vending.apk电子市场
MarketUpdater.apk市场更新
gtalkservice.apk跟下面的有一腿
Talk.apkgtalk
TalkProvider.apk跟上面的有一腿,也好像跟电子市场有婚外恋
GoogleXXXXXXX.apk基于google的一些服务
说实话,google是个让人又爱又狠的东西。首先,如果对google的任何服务都没兴趣,那建议全部删除以google开头的程序,还有电子市场和地图;其次,如果对任何google的单项服务感兴趣,那么有两个程序必须留下:GoogleApps.apk和GoogleCheckin.apk,这都通过我一一验证的。(对电子市场情有独钟,除了留下上面的两个以及Vending.apk和MarketUpdater.apk外,还要留下 gtalkservices.apk和TalkProvider.apk)
3.还是一些可删可不删的,但建议保留
Calculator.apk计算器
*Calendar.apk日历
*CalendarProvider.apk日历支持
*EmotionClockWidget.apk心情时钟
FMradio.apk收音机
*Gallery.apk图片浏览器
LocalCityWeatherClock.apk我的天气时钟
MyBookmarks.apk我的书签
*MyCalendar.ap我的日历
MyEvent.apk我的日程
*MyMemo.apk我的便签
MyVideo.apk我的视频
*NotePad.apk记事本
*PhotoAblumWidget.apk我的相册
WeatherClock.apk天气时钟
以上程序,论坛好多网友建议删除用第三方软件取代,但我这段时间试下来,感觉系统自带的这些程序对小u来说那就是郎才配女貌,鲜花配牛粪——很实用兼容也很好的,其他第三方的反倒没这些好好用,尤其是带星号的那几个,论坛里我真没找到有比原配的同类软件更好用,更实用的。还有一些目前好像没啥用,但以后可能会用上,比如语音支持的那个。
4.至于其他未提到的程序,无罪释放,各位切记要对他们手下留情。当然如果你残忍的无可救药你也可以牛刀小试,但记着告诉一下大家感受哦。
注:1..港版的参考以上,有的就删掉,除此之外港版还有一些特有程序也可以就地正法,包括所有的输入法,citylink开头的,road开头的,还有与 google街景相关的(街景,语音搜索什么的),这个大家都可以点一下安装然后看一下具体是什么,因为名称我也忘记了。
2..港版里的launcher2是android的原生桌面,个人觉得并不好用,运行程序多了会卡,再者主菜单里程序字体显示不是很好,不如华为的桌面,所以建议大家不要尝试了,直接删掉算了。
以上可能有不全的地方,仅供各位机友参考,希望热心的机友能补充和完善
第三篇:有用的安卓总结
一、文字的滚动显示:
android:layout_height=“wrap_content” android:ellipsize=“marquee” android:focusable=“true” android:focusableInTouchMode=“true” android:marqueeRepeatLimit=“marquee_forever” android:singleLine=“true” android:textColor=“#ff0000” android:text=“教育局亏合同预计给他6语含有距被告人他还预计个体业户 愚友好条约” /> 二、用意图拨打电话 1:Intent intent = new Intent(“android.activity.intent.action”,Uri.parse(“tel:” + 数字.toString))); 2:添加权限 三、ListView 第一步: 定义BaseAdapter类,实现getCount()和getView方法,定义构造函数 private LayoutInflater inflater; public SecAdapter(Context context){ inflater = LayoutInflater.from(context);} 如: @Override public int getCount(){ // TODO Auto-generated method stub return 10;} @Override public View getView(int arg0, View arg1, ViewGroup arg2) { arg1 = inflater.inflate(R.layout.adapter_sec, null); return arg1;} 其中R.layout.adapter_sec是每一个Item的布局样式 第二步: Activity中引用ListView布局,作为总体布局。定义并调用方法: private void initData(){ secAdapter = new SecAdapter(this); } private void initView(){ listView =(ListView)findViewById(R.id.listView1); listView.setAdapter(secAdapter); } ……………………………………………………….四、简单传值 Intent.putExtra(“key”,value); 获取: XXX s = Intent.getXXXExtra(“key”); 五:Activity之间切换的动画效果 Intent intent = new Intent(MainActivity.this, Second.class); startActivity(intent); /* Activity的切换效果,也可以使用Android.R.anim.系统文件名 */ overridePendingTransition(R.anim.entert, R.anim.exit); Android学习心得 -----093380117 计算机应用(1) 张峰 1.关于Activity 1.在一个Activity中使用多个View 如果把Activity看作MVC中的Control?它负责管理UI和接受事件(包括用户的输入),虽然说一个Activity通常对应一个屏幕,但事实上,我们是可以只用一个Activity管理多个不同的View来实现简单的逻辑。首先,我们增加一个新的资源描述layout/second.xml。 除了一个“Hello中国”以外,增加一个按钮可以返回前一个界面。然后,在代码中我们要为helloTwo增加两个方法,setViewOneCommand和setViewTwoCommand,分别处理一下在不同界面时,从资源里加载组件并为组件绑定一个事件处理器最后,我们需要在onCreate的时候,也就是启动后的main界面上设置一下按钮事件处理器。2.还是回到正道上,多个Activity之间的跳转 Android中提供一个叫Intent的类来实现屏幕之间的跳转,按文档的说法,似乎他们也建议采用这种方法,Intent的用法比较复杂,现在我先看看它最简单的用法。 这里的跳转功能用Intent来操作,它的最简单用法就是用函数setClass()设置跳转前后两个Activity类的实例,然后调用Activity自己的startActivity(intent)即可。最后一句finish()表示将当前Activity关掉(如果不关掉会如何?你可以自己试一下看效果,事实上有时我们是不需要关掉当前Activity的)。 然后,我们同样弄一个Activity类HelloThreeB,代码与前面的差不多,只是将setClass的两个参数反一下,这样就可以简单地实现在两个Activity界面中来回切换的功能了。 2.关于 Intent的使用 Intent分为两大类,显性的(Explicit)和隐性的(Implicit)。一般来说,intent要定位事件的目的地,无外乎需要以下几个信息: 1.种类(category),比如我们常见的 LAUNCHER_CATEGORY 就是表示这是一类应用程序。 2.类型(type),在前面的例子中没用过,表示数据的类型,这是隐性Intent定位目标的重要依据。 3.组件(component),前面的例子中用的是setClass,不过也可以用setComponent来设置intent跳转的前后两个类实例。4.附加数据(extras),在ContentURI之外还可以附加一些信息,它是Bundle类型的对象。 其实,如果是在一个应用内部,这种隐性的intent实在有点别扭,个人觉得,这种松藕合的实现方法,只适用于那些较大的系统或者多个不同的应用之间的调用,可手机上又有什么“较大”的系统呢?无非是可以与不同来源的多个应用之间方便地互操作而已,那么会是什么样的场景呢?比如,给QQ好友发送gmail邮件,用GoogleMap查找QQ好友所在的位置?看上去挺不错的。 关于这个ContentProvider,其实还有话说,它主要是的那些看似数据库操作的方法我们都没真正去实现呢。不过今天就到这里了,等下回再去研究吧。 3.关于ListActivity 准备一个List对象并借助Adapter就可以构造出一个列表。重载onListItemClick方法可以响应选择事件,利用第一个参数可以访问到这个ListView实例以得到选中的条目信息。这里有一点要说明的,就是如果更简单的话,其实连那个setContentView都可以不要了,Android也会自动帮我们构造出一个全屏的列表。但是本例中我们需要一个TextView来显示选中的条目,所以我们需要一个layout.mainb描述一下这个列表窗口。 这里需要注意的是那个ListView的ID,是系统自定义的android:list,不是我们随便取的,否则系统会说找不到它想要的listview了。然后,在这个listview之外,我们又增加了一个TextView,用来显示选中的条目。 再来说说这里用到的ArrayAdapter,它的构造函数中第二个参数是一个资源ID,ArrayAdapter的API文档中说是要求用一个包含TextView的layout文件,平台用它来显示每个选择条目的样式,这里的取值是R.layout.list_row,所以,我们还有一个list_row.xml文件来描述这个布局,相当简单。 从ArrayAdapter上溯到BaseAdapter,发现还有几个同源的Adapter也应该可以使用,象SimpleAdapter和CursorAdapter,还是做个例子来实验一下吧。 然后,在HelloTwoB中的onCreate函数中,修改代码,有几个不同:items的元素是HashMap实例,这是一点变化,然后构造函数除了要求items以外,还要求提供一个string[]来说明用hash表中的哪个字段显示在列表中,而后是一个资源ID的数组。 因为单纯的CursorAdapter是抽象类,所以我用的是它的子类SimpleCursorAdapter,很好理解,先用ContentResolver查询通讯簿得到一个游标,然后告诉SimpleCursorAdapter要用其中的People.NAME作为显示项来构造出一个adapter即可。4.关于Dialog 注意到android.app包下除了Dialog(可用于制作复杂的对话框)以外,还包括了几个系统定义好的对话框类,如DatePickerDialog、TimePickerDialog及AlertDialog。 其中AlertDialog我上回用过一次,基本上就那样子了,今天看看另外两个对话框的使用吧。 很简单的,无非是需要一个OnDateSetListener接口的实现而已,在它里面的dateSet方法中就可以得到选择的日期了。而TimePickerDialog与DatePickerDialog使用如出一辙。 看看另一个ProgressDialog的用法吧,这个类与AlertDialog一样包含了多个static的方法,所以使用起来是非常方便的。比如说,如果我们需要用它来表示一个长时间的操作。 5.关于Service和Notification 大略地看了一下android.app下的Service类,觉得它与Activity非常相似,只是要注意几个地方: 1.生命周期,Service的从onCreate()->onStart(int,Bundle)->onDestroy()显得更为简单。但是它的onStart是带参数的,第一个ID可用来标识这个service,第二个参数显示是用来传递数据的了。比较Activity,传递数据的Bundle是在onCreate就带进入的。 2.Service的启动由Context.startService开始,其实Activity或者Service都是Context的派生类。结束于Context.stopService()或者它自己的stopSelf()。 3.Service还有一个与Activity不一样的是它可以由另一个Context去绑定一个已存在的Service。就是这个方法Context.bindService(),被绑定的Service要求是已经onCreate了但可以没有onStart。在Service类中有个抽象方法getBinder()可以得到这个IBinder对象。关于这方面的细节,以后再看,这里只做个记录罢。 4.与Service有关的还有一个安全的问题,可以在AndroidManifest.xml中用 6.GridView与ImageView 简单一点吧,就瞧瞧那个Grid的效果,Android提供了一个GridView,不过从APIDemo中看来,它似乎与PC上的GRID差别还是挺大的,更像那个IconView的感觉。不知道Android中如何实现表格界面?虽然在移动终端上,表格一般不会有谁使用,大家似乎更倾向于使用ListView,而Android对于ListView则有更简单的实现ListActivity。 很简单,只要重载几个方法就可以了,关键是那个getView方法,它负责构建出每个单元格中的对象实例。这里我们构造的是一个ImageView实例。 然后就是同样的将这个Adapter赋给GridView即可,大家可以看看效果,注意在做这个例子前,先放几个小图片到res/drawable目录下,buildproject一下就可以得到那个R.drawable.a了(这里的a是图像文件名,如a.png)。 在getView方法中我们使用了ImageView类,这又是一个widget。除了上面用到的几个方法以外,还有以下几个方法值得注意: 与图像来源有关的方法,我们只用了资源文件的方式。 还是习惯性跑题了,其实,我是想通过我对这个类的无数次Debugger跟进,说说它的多线程异步处理的解决策略的。他的基本策略如下: 1.当你实例化一个AsyncQueryHandler类时(包括其子类...),它会单件构造一个线程(后面会详述...),这个线程里面会构建一个消息循环。 2.获得该消息循环的指针,用它做参数实例化另一个Handler类,该类为内部类。至此,就有了两个线程,各自有一个Handler来处理消息。3.当调用onXXX的时候,在XXX函数内部会将请求封装成一个内部的参数类,将其作为消息的参数,将此消息发送至另一个线程。4.在该线程的Handler中,接受该消息,并分析传入的参数,用初始化时传入的ContentResolver进行XXX操作,并返回Cursor或其他返回值。 5.构造一个消息,将上述返回值以及其他相关内容绑定在该消息上,发送回主线程。 6.主线程默认的AsyncQueryHandler类的handleMessage方法(可自定义,但由于都是内部类,基本没有意义...)会分析该消息,并转发给对应的onXXXComplete方法。 7.用户重写的onXXXComplete方法开始工作。 这就是它偷偷摸摸做过的事情,基本还是很好理解的。我唯一好奇的是它的线程管理方式,我猜测他是用的单件模式。第一个AsyncQueryHandler的实例化会导致创建一个线程,从此该线程成为不死老处男,所有的ContentResolver相关的工作,都由该线程统一完成。个人觉得这种解决方式很赞。本来这个线程的生命周期就很难估量,并且,当你有一个ContentProvider的请求的时候,判断你会做更多的类似操作并不过分。就算错了,花费的也只是一个不死的线程(与进程同生死共存亡...),换来的却是简单的生命周期管理和无数次线程生死开销的节约。同时另外一个很重要的问题,他并会涉及到单件中数据同步的问题,每个类都有各自的Handler类,彼此互不干扰,分发可以分别进行。当多个数据请求的时候,在同一个ContentResolver上进行的可能微乎其微,这就避免了堵塞。总而言之,这套解决办法和Android的整体设计算是天作之合了。 所以建议,如果你有什么非ContentProvider操作,却需要异步多线程执行的话,模拟一套,是个不错的策略,当然,具体情况具体分析,生搬硬套是学不好马列主义的。 7.显示控件使用 Android的界面显示同样也是基于控件的。通常是用View(包括ViewGroup)控件配上XML的样式来做的。具体细节不想说了,可以参考 Samples里的ApiDemos/View,和View的Doc,以及Implementing a UI这篇Doc。其他还有很多,感觉算是SDK讲述的最多的内容。 从控件的使用上,和网页的设计类似,尽量用parent_width之类的抽象长度,用Theme来做风格,抽取所有的字串等信息做本地化设计。相关内容参看Implementing a UI就好。 一类比较重要的是数据绑定控件。如果做过ASP.Net会从中看到很多类似的地方。一个支持数据绑定的控件,比如ListView。可以通过一个 ListAdapter绑定到一个数据源上。ListAdapter是一个抽象类,主要的实现类包括SimpleAdapter和 SimpleCursorAdapter。前者是绑定一个静态的Array,后者是绑定一个动态的Cursor。Cursor前面说过,是一个指向数据源的随机迭代器,将View绑定到Cursor通常要设置这样几个参数。一个是每一行的样式,称作Row Layout,其实就是一个普通的Layout的XML文件。还有就是一个列和现实控件的对应关系。那个控件显示哪个列的值,这是需要配置的。为了定制一个良好的数据显示控件,最简单你可以定制很PP的Row Layout,复杂一点就是可以重载绑定控件View,或者是适配器ListAdapter。如果是一个数据显示密集的应用,且你对UI有些追求,这个工作估计是必不可少的。 一个主要用于显示数据内容的Activity,可以选择派生自ListActivity。它提供了一个具有ListView 的Layout,还有simple_list_item_1, simple_list_item_2, two_line_list_item等默认的Row Layout,还有一些比较不错的API,和可供响应选择Item的事件。可以满足你比较基础的需求。如果你觉得只有一个ListView的界面太突兀,你可以为这个ListActivity指定一个Layout,需要注意的是,你需要提供一个id为@android:id/list的ListView控件,避免Activity在内部偷偷寻找该控件的时候失败。 除了这些要求,做好UI还有注意易用性和效率。快捷键是一个比较不错的选择,在 Activity中调用setDefaultkeyMode(SHORTCUT_DEFAULT_KEYS),可以开启快捷键模式,然后你可以将菜单绑定到指定快捷键上就OK了。个人觉得Tip也是一个比较重要的东西,但目前观察看来,这个东西只能够自己提供了。界面的动态性有时候是不可避免的,比如说菜单就是一个需要经常根据光标位置提供不同的选项。这个东西Android很人道的考虑到了,你可以参看NodeList这个Sample。它采取的应该是一个静态模拟动态的方式,这样有助于提高速度。你也可以利用ViewInflate,动态从一个XML创建一个控件。成本据Doc说很大,不到万不得已不要使用。 8.Intent消息传递 在前面写Android的ContentProvider时候,可以看到那是基于观察者模式的一个消息传递方法。每一个Cursor、ContentResolver做为一个小的注册中心,相关观察者可以在这个中心注册,更新消息由注册中心分发给各个观察者。而在MFC或Winform中,都会形成一个消息网,让消息在网中流动,被各节点使用、吃掉或者在出口死掉。 相比之下,我个人觉得基于Intent的Android核心消息传递机制是有所不同的。它应该会有一个全局性的注册中心,这个注册中心是隐性的,整个Android系统中就那么一个。所有的消息接收者,都被隐形的注册到这个中心。包括Activity,Service和IntentReceiver。其实说隐形注册是不确切的,所有注册都还是我们手动告诉注册中心的,只是与传统的方式不一样,我们通常不是通过代码,而是通过配置文件来做。在应用的Manifest中,我们会为一些Activity或Service添加上Intent-filter,或在配置文件中添加 当程序有一个消息希望发出去的时候,它需要将消息封装成一个Intent,并发送。这时候,应该是有一个统一的中心(恩,有可能Android底层实现的时候不是,但简单这样看是没问题的...)接受到这个消息,并对它进行解析、判定消息类型(这个步骤降低了耦合...),然后检查注册了相匹配的filter或receiver,并创建或唤醒接收者,将消息分发给它。这样做有很多好处。虽然这种传递有的时候不如点对点的传递快(这有些需要速度的地方,我们看到Android会通过直接通信来做),但有时候又因为它只经过一跳(姑且这么叫吧...),比复杂的流动又要更快。更重要的是,它耦合性低,在手机平台这种程序组件多变的条件下使用十分适合。并且它可以很容易实现消息的精确或模糊匹配,弹性很大。(我个人曾想在开发一个C++二次平台的时候引入这样的机制,但在C++中,建立一套完整的数据marshal机制不容易,相比之下,用java来做会简单很多...) 恩,废话说了很多,具体讲讲Android中Intent的使用。当你有一个消息需要传递,如果你明确知道你需要哪个Activity或者其他Class来响应的话,你可以指定这个类来接受该消息,这被称为显性发送。你需要将Intent的class属性设置成目标。这种情况很常见,比如startActivity的时候,会清楚当前Activity完了应该是哪个Activity,那就明确的发送这个消息。 但是,有的时候你并不确定你的消息是需要具体哪个类来执行,而只是知道接收者该符合哪些条件。比如你只需要有一个接收者能显示用户所选的数据,而不想制定某个具体的方法,这时候你就需要用到隐形发送(传统上,我们可能会考虑用多态,但显然这种方式更为灵活...)。在Android中,你可以为Intent指定一个action,表示你这个指令需要处理的事情。系统为我们定义了很多Action类型,这些类型使系统与我们通信的语言(比如在Activity里面加一个Main的filter,该activity就会做成该应用的入口点),当然你也可以用于你自己的应用之间的通信(同样当然,也可以自定义...)。强烈建议,在自己程序接收或发出一个系统action的时候,要名副其实。比如你响应一个view动作,做的确实edit的勾当,你发送一个pick消息,其实你想让别人做edit的事,这样都会造成混乱。当然只有Action有时候是不够的,在Android中我们还可以指定catalog信息和type/data信息,比如所有的显示数据的Activity,可能都会响应View action。但很多与我们需要显示的数据类型不一样,可以加一个type信息,明确的指出我们需要显示的数据类型,甚至还可以加上一个catalog信息,指明只有你只有按的是“中键”并发出这样的消息才响应。从上面可以看出,Android的Intent可以添加上class, action, data/type, catalog等消息,注册中心会根据这些信息帮你找到符合的接收者。其中class是点对点的指示,一旦指明,其他信息都被忽略。Intent中还可以添加key/value的数据,发送方和接收方需要保持统一的key信息和value类型信息,这种数据的marshal在java里做,是不费什么力气的。 Android的Intent发送,可以分成单播和广播两种。广播的接收者是所有注册了的符合条件的IntentReceiver。在单播的情况下,即使有很多符合条件的接收者,也只要有一个出来处理这个消息就好(恩,个人看法,没找到确切条款或抉择的算法,本来想实验一下,没来得及...),这样的情况很容易理解,当你需要修改某个数据的时候,你肯定不会希望有十个编辑器轮流让你来处理。当广播不是这样,一个receiver没有办法阻止其他receiver进行对广播事件的处理。这种情况也很容易理解,比如时钟改变了,闹钟、备忘录等很多程序都需要分别进行处理。在自己的程序的使用中,应该分清楚区别,合理的使用。 9.ContentProvider数据模型 数据库操作 从我目前掌握的知识来看,SQLite比较轻量(没有存储过程之类的繁杂手段),用起来也比较简单。实例化一个SQLiteDatabase类对象,通过它的APIs可以搞定大部分的操作。从sample中看,Android中对db的使用有一种比较简单的模式,即派生一个 ContentProviderDatabaseHelper类来进行SQLiteDatabase对象实例的获取工作。基本上,ContentProviderDatabaseHelper类扮演了一个singleton的角色,提供单一的实例化入口点,并屏蔽了数据库创建、打开升级等细节。在ContentProvider中只需要调用ContentProviderDatabaseHelper的openDatabase方法获取SQLiteDatabase的实例就好,而不需要进行数据库状态的判断。URI 像进行数据库操作需要用SQL一样,对ContentProivder进行增删改查等操作都是通过一种特定模式的URI来进行的(ig:content: //provider/item/id),URI的能力与URL类似,具体细节可以查看SDK。建立自己的ContentProvider,只需要派生 ContentProivder类并实现insert, delete, update等抽象函数即可。在这些接口中比较特殊的是getType(uri)。根据传入的uri,该方法按照MIME格式返回一个字符串(==!没听过的诡异格式...)唯一标识该uri的类型。所谓uri的类型,就是描述这个uri所进行的操作的种类,比如content://xx/a与 content://xx/a/1不是一个类型(前者是多值操作,后者是单值),但content://xx/a/1和content://xx/a/2 就会是一个类型(只是id号不同而已)。 在ContentProvider通常都会实例化一个ContentURIPraser来辅助解析和操作传入的URI。你需要事先(在static域内)为该ContentURIPraser建立一个uri的语法树,之后就可以简单调用 ContentURIPraser类的相关方法进行uri类型判断(match方法),获取加载在uri中的参数等操作。但我看来,这只是在使用上简化了相关操作(不然就需要自己做人肉解析了...),但并没有改变类型判定的模式。你依然需要用switch...case...对uri的类型进行判断,并进行相关后续的操作。从模式来看,这样无疑是具有强烈的坏味道,类似的switch...case...代码要出现N此,每次一个 ContentProvider做uri类型的增减都会需要遍历修改每一个switch...case...,当然,如果你使用模式(策略模式...)进行改造对手机程序来说无疑是崩溃似的(类型膨胀,效率降低...),所以,只能是忍一忍了(恩,还好不会扩散到别的类中,维护性上不会有杀人性的麻烦...)。增删改查 ContentProvider 和所有数据源一样,向外提供增删改查操作接口,这些都是基于uri的指令。进行insert操作的时候,你需要传入一个uri和 ContentValues。uri的作用基本就限于指明增减条目的类型(从数据库层面来看就是table名),ContentValues是一个 key/value表的封装,提供方便的API进行插入数据类型和数据值的设置和获取。在数据库层面上来看,这应该是column name与value的对应。但为了屏蔽ContentProvider用户涉及到具体数据库的细节,在Android的示例中,用了一个小小的模式。它为每一个表建一个基于BaseColumn类的派生类(其实完全可以不派生自BaseColumn,特别当你的表不基于默认的自动id做主键的时候),这个类通常包括一个描述该表的ContentURI对象和形如 public static final TITLE = “title”这样的column到类数据的对应。从改变上角度来看,你可以修改column的名字而不需要更改用户上层代码,增加了灵活性。insert方法如果成功会返回一个uri,该uri会在原有的uri基础上增加有一个row id。对于为什么使用row id而不是key id我想破了脑袋。到最后,我发现我傻了,因为ContentProvider不一定需要使用数据库,使用数据库对应的表也可以没有主键,只有row id,才能在任何底层介质下做索引标识。 但,基于row id在删除和修改操作是会造成一定的混乱。删除和修改操作类似。删除操作需要传入一个uri,一个where字串,一组where的参数(做条件判定...),而修改操作会多一个ContentValues做更新值。着两个操作的uri都支持在末尾添加一个row id。于是混乱就出现了。当在where参数中指明了key id,而在uri中提供了row id,并且row id和key id所指函数不一致的时候,你听谁的?示例代码中的做法是完全无视row id(无语...),如此野蛮的方式我估计也只能在示例中出现,在实际中该如何用,恩,我也不知道。幸运的是,我看了下上层对 ContentProvider的删除操作,其实都不会直接进行,而是通过调用Cursor的delete方法进行,在这前提下,我想Cursor会处理好这些东西吧。 最后一个操作是查询操作,可以想见,查询的参数是最多的,包括uri和一组条件参数。条件参数类型和标准的sql类似,包括 sort, projection 之类的。从这些参数到sql语句的生成,可以寻求QueryBuilder类的帮助,它提供了一组操作接口,简化了参数到sql的生成工作,哪怕你不懂 sql都完全没有问题(这话说的我自己都觉得有点悬...)。查询返回一个Cursor。Cursor是一个支持随机读写的指针,不仅如此,它还提供了方便的删除和修改的API,是上层对ContentProvider进行操作一个重要对象,需要仔细掌握(Cursor还可以绑定到view上,直接送显,并与用户进行交互,真是程序越往上,封装越好,工作越机械没有复杂性了...)。数据模型 在与界面打交道的Cursor、ContentResolver等数据操作层中,大量采用观察者模式建立数据层与显示层的联系。一个显示层的视图,可以做成某一种观察者注册到Cursor或ContentResolver等数据中间层中,在实现底层ContentProvider中,我们需要特别注意在对数据进行修改操作(包括增删改...)后,调用相应类型的notify函数,帮助表层对象进行刷新(还有一种刷新方式是从一个view发起的)。可以看到 Android的整体数据显示框架有点像MVC的方式。Cursor、ContentResolver相当于控制层,数据层和显示层的交互通过控制层来掌管,而且控制层很稳定不需要特别定制,通常工作只在定制数据层和显示层空间,还是比较方便和清晰的。 10.学习感想 通过这学期对安卓的学习,大概了解了以上一些知识,对安卓有了初步的了解,这几个月给我的东西我想用有形的和无形的两部分概叙,形的当然就是技术水平的长进,虽然其中肯定有很多的不足,相信慢慢会体会到。 如何学习安卓 想学编程开发,那要先会一门编程语言,现在可以试着去学学C语言,虽然这个安卓沾不上边,但是,C语言的编程思想还是很重要的,学完了C语言之后,他的语法基本上和所有的编程语言都很相像,能影响你的思维,帮助你理解其他的编程语言的。之后呢,在好好看看《数据结构》,这很重要。然后再去学学Java语言,因为Android的应用的开发语言用的是Java,所以一定要好好学习。 最后了解下数据库,我们在学习数据库之前都先学了《数据库原理》《离散数学》《关系代数》,有了这些基础之后再去学数据库,数据库也有很多可以选择的,推荐mysql。 加油!第四篇:安卓学习心得
第五篇:如何学习安卓