Android是Google一个开放源代码的手机操作系统,既然是手机,那么不管它有多么智能它最重要的两个功能当然是打电话和发短信了。我用了将近一个月的时间看了信息模块,这是一个庞大的模块,要将其完全弄清楚还是需要很长一段时间。在看源码的过程中我也遇到不少的问题,但是在源码里我学到了很多东西也拓展了我的思维。
拿到源码当然是先编译了,编译也是一个漫长的过程足足等了一个小时。既然要学信息模块,当然要先会玩信息了,于是我在模拟器上熟悉了信息的各个界面,菜单,以及发送接收信息的操作。一切准备工作做好后,就正式开始学习源码了。
在manifest.xml找这个模块的主Activity也就是进入短信的一个界面。这个Activity叫ConversationList继承自ListActivity。ConversationList的每个列表代表一个会话,这个列表是通过AsyncQueryHandler查询mmssms.db数据库中的threads表的数据用CursorAdapter将数据显示出来。其中有查看联系人,查看会话,删除会话等操作。另外该类中的runOneTimeStorageLimitCheckForLegacyMessages方法用于检测存储空间限制。点击一项ListIte或者是ContextMenu传入threadId通过这个Id来和AsyncQueryHandler来查询数据库中这个会话的所有信息,利用CursorAdapter显示布局到ComposeMessageActivity的message_list_item上。
ComposeMessageActivity是一个很庞大的类,每个ComposeMessageActivity 录属于一个Conversation或者不属于任何conversation(无收件人草稿);每个converation由独立的threadId来相互区分 ,每个ComposeMessageActivity有一个WorkingMessage是唯一的,表示在这个thread下,用户编辑的短信草稿。ComposeMessageActivity和ConversationList的launch mode都是singleTop,利用Observer监听,一旦有短心到来或者是发送,都将AsyncQueryHandler查询数据库并且将需要的内容显示在界面上。我们来看这个Activity的初始化过程,ComposeMessageActivity的onSaveInstanceState()函数中,会保存一份联系人,同时保存workingMessage的subject标题/body正文/uri草稿在数据库中的位置 :
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("recipients",getRecipients().serialize());
mWorkingMessage.writeStateToBundle(outState);
if (mExitOnSent) {
outState.putBoolean("exit_on_sent", mExitOnSent);
}
}
WorkingMessage中的代码片段:
public void writeStateToBundle(Bundle bundle) {
if (hasSubject()) {
bundle.putString("subject", mSubject.toString());
}
if (mMessageUri != null) {
bundle.putParcelable("msg_uri", mMessageUri);
} else if (hasText()) {
bundle.putString("sms_body", mText.toString());
}
}
这样当我们离开后再回到这个Activity时调用initActivityState,如果我们之前保存了联系人,则会从旧有联系人里面读取出来,联系人相互之间用“;”分割开 。 workingmessage也由之前保存的变量初始化,这个初始化就基本完成了。如果没有保存,则从传入的intent中读取thread_id值,进而得到初始化需要的信息:如果thread_id>0 ;那么mConversation从Conversation的cache中,有thread_id取得;如果thread_id<=0,那么从intent的Data获得uri;再不行,就说明之前没有过这个thread了,可能我们是手写的地址,就从address去产生一个ContactList,从ContactList去Conversation的Cache里匹配得到相应的Conversation,这时如果匹配还没有得到Conversation的话,就会通过getOrCreateThreadId(Context context, ContactList list)来获得一个threadId再通过new Conversation(Context context, long threadId, boolean allowQuery)来创建一个Conversation ,然后Cache偷偷将这个Conversation存放起来,适用于你这个状况;如果联系人也是空的,那么直接产生一个新的Conversation; 这个Conversation是廉价的,因为他没有thread_id,不被放入cache,在使用ensurethreadid之前,他可以创建无数个,可以随意调用创建出来。
有了conversation之后,就可以initMessageList,查询显示出这个thread下面的所有消息。ComposeMessageActivity还继承了MessageStatusListener接口——对信息状态的监听,这个接口中有很多未实现的方法:onProtocolChanged(boolean mms),onAttachmentChanged(),onPreMessageSent(),onMessageSent(),onMaxPendingMessagesReached(),onAttachmentError(int error);这些方法也能从字面含义上判断其作用,尤其是 onProtocolChanged这个它能判断是否为彩信还短信。
ForwardMessageActivity,它是ComposeMessageActivity的别名,用于转发消息的Activity将一条现有的消息的内容相当于复制到一个新的ComposeMessageActivity中。DeliveryReportActivity,用于报告消息状态的Activity它采用了对话框风格的主题(android:theme="@android:style/Theme.Dialog")。WarnOfStorageLimitsActivity,告知用户关于存储空间限制的设置信息。 ConfirmRateLimitActivity,发送多条彩信时向用户提示确认的界面,在用户超过一段时间未作出响应时自动取消发送的操作。ManageSimMessages,用于管理Sim卡中短消息的界面,它以列表的形式显示了存储在SIM卡中的短消息,并允许用户将信息转存到手机内存中,或者删除消息。 MessagingPreferenceActivity 这是Messaging应用的系统配置界面,其中有针对SMS、MMS、存储限制等配置属性,以及管理存储在SIM卡中的短信消息。该Activity启动时会检查当前是否有SIM,以及是否支持MMS来动态调整配置项列表。SearchActivity,Android通过系统服务Context. SEARCH_SERVICE(即SearchManager类)提供了强大的信息搜索功能。在该应用中通过对联系人(或者电话号码)、主题等信息的匹配来搜索信息,并将结果显示在一个列表中。 SlideshowEditActivity,这个Activity对幻灯片的张数,位置的设定。SlideEditorActivity,用于编辑幻灯片内容的操作界面,它提供了:添加、移除 、预览文本/图片/音乐,以及Slide等功能。SlideshowActivity,用于播放Slide幻灯片的界面,它会在全屏状态下显示幻灯片的内容。EditSlideDurationActivity,用于修改Slide幻灯片持续显示时间的操作界面,默认持续显示时间是5秒。ClassZeroActivity,直接显示用户屏幕上并等待用户操作的0类信息(没见过)。
包com.android.mms中有个类叫做MmsAPP继承了Application,在其onCreate方法里调用这样一些方法:MmsConfig.init(this); Contact.init(this);DraftCache.init(this);Conversation.init(this);
DownloadManager.init(this);RateController.init(this); DrmUtils.cleanupStorage(this); LayoutManager.init(this); SmileyParser.init(this);MessagingNotification.init(this);这些初始化方法在程序运行的效率上提供了大大的方便。在包com.android.mms.transation中包含短信的接收,发送,状态以及通知等,其中包含很多服务和广播。
看完这个模块我自己也试着写了ConversationList和ComposeMessageActivity,为了测试这两个界面是否可用,我开始是用了Map和List这两个容器来模拟数据库的信息,
在这个过程还是遇到了不少的问题,比如像Adapter的选用,我选用BaseAdpter,这和CursorAdaptere还是有很大的区别的;还有怎么让Conversation和它包含的信息联系起来。在测试好之后,要将数据变成活的数据,也就是需要读取数据库中的信息。由于在An
droid将某些类屏蔽了,所以读取数据库不能用源码中的SqliteWrapper.query(Context
context, ContentResolver resolver, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder),这就要用到ContentProvider了来实现了getContentResolver().query(Uri,String[], String, String[], String), Uri也要自己从源码中找到最原始的(形如:content://mms/),还有涉及到权限问题android.permission.READ_SMS,当然Adapter也要换成相应的CursorAdapter了。
Mmssms.db中常用表的Uri:
threads(会话)表:content://mms-sms/conversations
每个会话中所有的信息:content://mms-sms/conversations/threadId(这个会话的id)
canonical_addresses(接收者)表:content://mms-mms/canonical-addresses
草稿:content://mms-sms/draft
锁:content://mms-sms/locked
pud(彩信):content://mms
part(附件文件)表:content://mms/part
sms(短信):content://sms
分享到:
相关推荐
总之,通过研究Android 2.2源码,开发者不仅可以了解Android系统的架构,还能学习到最佳实践,提高解决问题的能力。同时,这对于那些希望参与系统级定制或开发定制ROM的开发者来说,更是不可或缺的学习资源。因此,...
"Android 2.2源码"提供了一个宝贵的资源,让开发者能够探索Android操作系统的内部工作原理,从而更好地进行定制化开发和优化应用程序。以下是关于Android 2.2源码的一些关键知识点: 1. **Linux内核**:Android是...
以下是关于Android 2.2源码的一些核心知识点: 1. **源码获取与构建**:Android源码是开放的,可以在Android开源项目(AOSP)官方网站获取。解压缩后,需要配置环境,包括安装Git、Java JDK、Android SDK和NDK,然后...
《深入解析Android 2.2源码》 Android 2.2,又称为Froyo(冻酸奶),是Google发布的一个重要版本,它在Android操作系统的发展历程中扮演了关键角色,引入了许多性能优化和新特性。本文将围绕Android 2.2的源码展开...
下面是对Android 2.2源码结构的详细说明。 1. **源码仓库**:Android源码主要存储在Git仓库中,由Android开放源代码项目(AOSP)管理。开发者可以访问[https://source.android.com/](https://source.android.com/)...
Android 2.2 源代码的整体结构相当复杂,但通过合理的分类和组织,使得开发者能够快速定位到自己感兴趣的模块。以下是对主要目录的概述: 1. **Makefile**:根目录下的 Makefile 文件定义了构建整个 Android 系统所...
《Android 2.2 ApiDemos深度解析》 在Android开发领域,ApiDemos是一个非常重要的参考资料,它是由Google官方提供的一个示例程序,包含了Android SDK中的各种API功能的演示。这个项目,针对的是Android 2.2(API...
《深入剖析Android 2.2电话(Phone)源码》 Android系统以其开源特性吸引了无数开发者,其中,电话模块(Phone)是系统的核心组件之一,它负责处理语音通话和相关的通信功能。Android 2.2(Froyo)版本中的电话源码...
描述中的信息虽然重复,但再次确认了文件内容与Android 2.2源码相关。通常,这样的源代码包会包含Android系统的各个组件、库、框架、以及测试代码等。 标签“android2.2”进一步强化了这个文件与Android 2.2版本的...
本示例源码是一个基于Android 2.2(API Level 8)的照相机应用Demo,适用于快速集成到你的项目中。下面将详细介绍这个Demo中的关键知识点和实现细节。 1. **AndroidManifest.xml配置** 在Android应用中,使用...
一、Android 2.2源码概述 Android 2.2的源码包含了系统的各个层次,从底层驱动到上层应用程序框架。开发者可以借此了解系统运行机制,调试问题,以及进行定制化开发。源码主要分为以下几个部分: 1. Linux内核:...
这篇文档将深入解析“小程序源码 高仿基于Android 2.2 (Froyo)的Contacts.zip”这个项目,该源码旨在模仿Android 2.2版本(Froyo)中的联系人应用。我们将围绕Android开发、小程序设计、源码结构以及与原生Contacts...
《深入剖析Android SDK 2.2源码》 Android SDK(Software Development Kit)是开发者构建、调试和优化Android应用程序的基础工具集。对于Android 2.2(Froyo)版本的SDK,其源码提供了对操作系统核心功能和API实现...
在这个"GUI--QTE2.2源码.rar"压缩包中,我们可以期待找到QTE2.2版本的源代码,这对于开发者来说是一份宝贵的资源。源代码允许我们深入理解QTE2.2的工作原理,对其进行定制、调试或者扩展,以满足特定项目的需求。...
对于源码相关的工作,Android 2.2的源码可以在AOSP(Android Open Source Project)仓库找到。开发者可以通过Git克隆源码,然后使用SDK中的构建工具`mm`或`m`编译特定模块。 总的来说,搭建Android SDK 2.2开发环境...
总结起来,移植Android 2.2到OMAP3530平台涉及的步骤包括:环境配置、源代码获取与同步、编译Android系统、内核定制、交叉编译工具链的安装以及Eclipse集成。每个环节都需要仔细操作,以确保移植过程的顺利进行。
在Android 2.2 (API级别8)的源码中,开发者可以找到很多关键的系统组件,例如Dalvik虚拟机(在Android 4.4中被ART取代)、SQLite数据库支持、网络通信模块以及UI框架等。通过对这些组件的研究,开发者能够提高其...
总结,Android Calendar源码的解析是一次深入理解Android系统服务和应用开发的宝贵实践。通过对源码的阅读和学习,开发者不仅可以掌握日历应用的实现细节,还能提升对Android系统整体架构的理解,为今后的开发工作...
《安卓Android源码解析——深度探索基于2.2(Froyo)的Contacts应用》 在Android操作系统中,Contacts应用是用户日常接触最频繁的应用之一,它负责管理设备上的联系人信息。本篇将深入探讨基于Android 2.2(Froyo)...
《深入剖析Android 2.2源码:C/C++编程视角》 Android 2.2,也被称为Froyo(冻酸奶),是Android操作系统的一个重要版本,它在2010年发布,带来了诸多性能提升和新功能。本文将从C/C++编程的角度,深入探讨Android ...