阅读权限
50
注册时间
2010-6-2
最后登录
2011-2-16
在线时间
164小时
高级工程师, 积分 790, 距离下一级还需 210 积分
UID
33147
精华
1
帖子
224
e望
3 点
e币
383 元
在线时间
164小时
|
回复 Jessical 的帖子
Messaging中的Activity Activity是用来构建UI(用户界面)的组件,用户操作界面代表了应用程序提供的基本功能,是应用程序和用户之间的交互接口。在Messaging应用中有以下的Activity: 1、.ui.ConversationList,对话列表界面,这是进入应用程序的主界面。它有两个配置属性值得我们特别注意,a.android:configChanges="orientation|keyboardHidden":在Android系统中,当程序所运行的环境(如:屏幕方向、键盘状态、字体等级,等等)发生变化后 会导致Activity被重新启动(以适应环境变化),然而Activity也可以宣称自己来应付某些变化(而不是一股脑地全让系统重启自己),configChanges属性正是用于指定自己愿意应付的变化情况。此处该属性有两个值,orientation代表屏幕方向发生改变,keyboardHidden表示键盘可访问状态发生变化(即键盘弹出/收起),这意味着当屏幕方向和键盘可用状态发生变化时, Activity不会被重新启动,而是调用其onConfigurationChanged方法,通常是在该方法中对自己做出调整,以适应变化;b.launchMode="singleTop":该属性指示了Activity的加载模式,这与Activity在不同Task之间的重用有关,该属性共有4个可用选项standard, singleTop,singleTask,singleInstance,它们将与Intent中的FLAG_ACTIVITY_* 标记常量协同产生相关作用。 ConversationList类中定义了程序中涉及到的选项菜单、会话(Conversation)项上的上下文菜单等UI元素。另外该类中的runOneTimeStorageLimitCheckForLegacyMessages方法用于检测存储空间限制。 SmsRejectedReceiver.java中有编译错误,因为它无法访问以下类: 1.android.provider.Telephony类,所在位置-myeclair\frameworks\base\core\java\android\provider\Telephony.java,该类被标记为@hide 。 2.com.google.android.mms.*:位置-myeclair\frameworks\base\core\java\com\google\android\mms\*,这些类未包括在公开的API中。 2、.ui.ComposeMessageActivity,创建新消息的用户界面,通过选项菜单menu_compose_new会调用到该界面。这是个很庞大的类,内部实现也很复杂,等仔细看了再写补充吧。 ComposeMessageActivity.java中有编译错误,因为它无法访问以下类: 1.com.android.internal.widget.ContactHeaderWidget类,所在位置-myeclair\frameworks\base\core\java\com\android\internal\widget\ContactHeaderWidget.java,该类被标记为@hide 。 2.com.android.internal.telephony.*类,所在位置-myeclair\frameworks\base\telephony\java\com\android\internal\telephony\*,这些类未包括在公开的API中。 3.com.google.android.mms.*:位置-myeclair\frameworks\base\core\java\com\google\android\mms\*,这些类未包括在公开的API中。 3、.ui.ForwardMessageActivity,用于转发消息的Activity,这是ComposeMessageActivity的别名,用于把一条现有消息的内容带到创建消息的界面上; 4、.ui.DeliveryReportActivity,投递报告Activity,用于报告消息的投递状态,它采用对话框风格的主题(android:theme="@android:style/Theme.Dialog")。 DeliveryReportActivity.java中有编译错误,因为它无法访问以下类: 1.com.google.android.mms.*:位置-myeclair\frameworks\base\core\java\com\google\android\mms\*,这些类未包括在公开的API中。 2.android.provider.Telephony类,所在位置-myeclair\frameworks\base\core\java\android\provider\Telephony.java,该类被标记为@hide 。 5、.ui.WarnOfStorageLimitsActivity,存储空间限制警告,用于告知用户 关于存储空间限制的设置信息。 WarnOfStorageLimitsActivity.java中有编译错误,因为它无法访问以下类: 1. com.android.internal.app.AlertActivity类,位置-myeclair\frameworks\base\core\java\com\android\internal\app\AlertActivity.java,该类未包括在公开的API中。 2. com.android.internal.app.AlertController类,位置-myeclair\frameworks\base\core\java\com\android\internal\app\AlertController.java,该类未包括在公开的API中。 6.ui.ConfirmRateLimitActivity,发送多条彩信时向用户提示确认的界面,它包括了自动应答操作——即用户超过一段时间未作出响应时自动取消发送。 7、.ui.ClassZeroActivity,ClassZero是一种特殊的短消息类型,它会直接显示在用户屏幕上并等待用户操作。ClassZeroActivity正是用来显示此类型的短信消息,并运行用户将信息保存起来。 ClassZeroActivity.java中有编译错误,因为它无法访问以下类: 1.android.provider.Telephony类,所在位置-myeclair\frameworks\base\core\java\android\provider\Telephony.java,该类被标记为@hide 。 2.com.google.android.mms.util.SqliteWrapper:位置-myeclair\frameworks\base\core\java\com\google\android\mms\util\SqliteWrapper.java,该类未包括在公开的API中。 8、.ui.MessagingPreferenceActivity,这是Messaging应用的系统配置界面,其中有针对SMS、MMS、存储限制等配置属性,以及管理存储在SIM卡中的短信消息。该Activity启动时会检查当前是否有SIM,以及是否支持MMS来动态调整配置项列表。 MessagingPreferenceActivity.java中有编译错误,因为它无法访问TelephonyManager.getDefault()方法,可以考虑使用Context.getSystemService(Context.TELEPHONY_SERVICE)方法来得到类实例。 9、.ui.ManageSimMessages,用于管理Sim卡中短消息的界面,它以列表的形式显示了存储在SIM卡中的短消息,并允许用户将信息转存到手机内存中,或者删除消息。 ManageSimMessages.java中有编译错误,因为它无法访问以下类: 1.android.provider.Telephony类,所在位置-myeclair\frameworks\base\core\java\android\provider\Telephony.java,该类被标记为@hide 。 2.com.google.android.mms.util.SqliteWrapper:位置-myeclair\frameworks\base\core\java\com\google\android\mms\util\SqliteWrapper.java,该类未包括在公开的API中。 10、.ui.SearchActivity,用于信息搜索的操作界面。Android通过系统服务Context. SEARCH_SERVICE(即SearchManager类)提供了强大的信息搜索功能。在该应用中通过对联系人(或者电话号码)、主题等信息的匹配来搜索信息,并将结果显示在一个列表中。 SearchActivity.java中有编译错误,因为它无法访问以下类: 1.android.provider.Telephony类,所在位置-myeclair\frameworks\base\core\java\android\provider\Telephony.java,该类被标记为@hide 。 11、.ui.SlideshowEditActivity,所谓Slide是指MM中的一页内容 即一帧,通常被称为幻灯片。SlideshowEditActivity是彩信中所有内容(即多个Slide)的列表,用户可以选定列表项进入Slide播放/修改界面。 SlideshowEditActivity.java中有编译错误,因为它无法访问以下类: 1.com.google.android.mms.*:位置-myeclair\frameworks\base\core\java\com\google\android\mms\*,这些类未包括在公开的API中。 12、.ui.SlideshowActivity,用于播放Slide幻灯片的界面,它会在全屏状态下显示幻灯片的内容。 SlideshowActivity.java中有编译错误,因为它无法访问以下类: 1.com.google.android.mms.*:位置-myeclair\frameworks\base\core\java\com\google\android\mms\*,这些类未包括在公开的API中。 13、.ui.SlideEditorActivity,用于编辑Slide幻灯片内容的操作界面,它提供了:添加、移除 文本/图片/音乐,以及Slide等功能。 SlideEditorActivity.java中有编译错误,因为它无法访问以下类: 1.com.google.android.mms.*:位置-myeclair\frameworks\base\core\java\com\google\android\mms\*,这些类未包括在公开的API中。 14、.ui.EditSlideDurationActivity,用于修改Slide幻灯片持续显示时间的操作界面,默认持续显示时间是5秒。 EditSlideDurationActivity.java编译无错误。 Messaging中的Service 应用中共有两个service:.transaction.TransactionService 和.transaction.SmsReceiverService,前者负责处理与彩信(MMS)相关的网络业务,后者是短消息(SMS)的接收器,两者都会响应来自通讯网络的通知并收取信息。它们只用于本应用内部(因为其未声明任何intent-filter),上文介绍的广播接收器中有显式启动它们的代码。以下我们将分别分析两个Service的基本实现。 1、.transaction.SmsReceiverService,它被创建时首先初始化了新的工作线程(HandlerThread对象)用来在后台完成相关动作,紧接着在onStartCommand方法里会将具体的任务通过消息(即调用service的Intent)发送给工作线程进行处理。根据Intent.Action的名称,工作线程会处理4中情况: A.系统启动完成后BOOT_COMPLETED:把发件箱(outbox)中的消息移动到发送队列(QueuedBox),然后开始发送队列中的消息,最后调用updateNewMessageIndicator方法更新状态栏消息指示图标; B.处理Sms接收handleSmsReceived:从Intent中取得消息对象,直接显示给用户(Class0类型)或者保持到数据库中。 C.处理Sms发送handleSmsSent:从待发送消息队列中取得消息,并按次序逐个发送; D.处理通讯网络状态改变handleServiceStateChanged:用户从无信号状态进入有信息号状态后,继续执行发送任务的情况; 2、.transaction.TransactionService,是处理与彩信相关业务的服务组件,根据代码中的注释可以了解到:收发彩信时可以是移动数据网络(mobile data network)或Wi-Fi网络。当没有可用的移动数据网络连接时,会尝试通过Wi-Fi网络发送/接收MMS信息(如果有Wi-Fi网络的话)。 它同样在onCreate方法里首先创建了后台工作线程,通过NetworkConnectivityListener类(一个被@hide的类)监听通讯网络链接状态的变化,并根据不同的链接状态作出相应的反应。 紧接着就是onStartCommand方法了,它首先会检测当前的网络连接状态,然后分别完成以下几件事情: A.针对收发彩信的业务,它将intent.getExtras()包装成一个DTO—— TransactionBundle,再通过launchTransaction()方法将具体工作交给后台工作线程去处理。 B.如果intent.getExtras()为Null时,它会尝试从数据库中扫描是否有(上次系统结束时)未完成的操作,如果有则遍历所有操作项,逐个调用launchTransaction()方法,以完成操作; 重点还是在后台工作线程的处理逻辑上,在代码中表现为handleMessage方法,它共处理以下几种不同类型的业务消息: Ⅰ.EVENT_CONTINUE_MMS_CONNECTIVITY,与彩信系统建立网络连接,它首先会检查当前是否有待处理的业务,然后通过调用beginMmsConnectivity方法来创建于彩信系统的网络连接,如果网络连接被正确建立,那么它会通过一个30秒间隔的计时器来维持连接的持续存在; Ⅱ.EVENT_DATA_STATE_CHANGED,网络连接状态发生改变分支,这一分支是通过对NetworkConnectivityListener对象的监听而获得回调。在该分支中首先确认了网络连接的有效性,(代码在此处仅允许ConnectivityManager.TYPE_MOBILE_MMS类型那么wi-fi连接属于该类型?),然后创建TransactionSettings对象,并调用processPendingTransaction方法处理具体的彩信业务; Ⅲ.EVENT_TRANSACTION_REQUEST,这是对具体彩信业务的处理分支,它首先创建了承载业务参数的TransactionSettings对象,该对象包含有彩信中心服务地址(mmscUrl)、代理服务器地址和端口等用于建立网络连接的参数,然后根据不同的业务类型,分别进行处理。当前仅明确处理了以下4中业务: 1、NOTIFICATION_TRANSACTION,通过一条Push数据,通知手机端收到有新信息; 2、RETRIEVE_TRANSACTION,收取彩信; 3、SEND_TRANSACTION,发送彩信; 4、READREC_TRANSACTION,彩信阅读报告; 用于处理具体业务的关键代码在processTransaction方法中,它首先检查业务是否已存在于处理队列中(mProcessing & mPending),然后调用beginMmsConnectivity()方法确认网络连接有效性,并点亮终端屏幕,然后将业务对象条件到处理队列中并向业务附加观察者,最后调用业务自身process()方法完成网络通信。注意:业务的process方法被调用又会触发观察者(即当前service)的update方法被调用,这使得刚才被处理掉的业务从队列中被移除,并且开始处理下一条业务; Ⅴ.EVENT_HANDLE_NEXT_PENDING_TRANSACTION,这是一个多条彩信业务能够被连续处理的关键分支,首先在当前service中有mProcessing数组列表用于缓存连续的彩信业务,每条彩信业务是一个可被观察的对象(注:观察者模式),当前service是唯一观察者,其会感知到一条业务已处理结束,并触发下一条业务处理的开始; 所有彩信业务处理完成后,会调用service中的endMmsConnectivity()方法,结束与彩信中心的网络连接,并撤销屏幕点亮。
|
|
相关推荐
Android2.1消息应用(Messaging)源码学习笔记.pdf
Android Instant Messaging Application VIL - Very Important Link's V-City Demo-App PlayStore Installation-Tutorial Features User registration User authentication Adding a new friend by username ...
spring-messaging源码,可以直接导入Eclipse工程里面!
《Android 4高级编程(第3版)》由Android权威专家编写,涵盖了所有最新的内容,是学习使用Android 4SDK开发移动应用程序的理想指南。本书见解深刻,帮助经验丰富的Android开发人员充分挖掘Android4的新特性的潜力...
Appium_Android_MessagingApp Android Messaging应用程序的自动化IntelliJ先决条件确保Appilum本地服务器在(或者您可以在上更改url) TestNG插件必须安装在IntelliJ Idea上脚步来自版本控制的新项目> git>复制此URL...
An application for two-way text messaging over Bluetooth. BusinessCard An application that demonstrates how to launch the built-in contact picker from within an activity. This sample also uses ...
Odoo Mobile Messaging Client v2.0 Odoo Mobile Client is Enterprise Social Client based on Android, enables you to access your Odoo Wall Messages from inbox and groups, encourage you to updated with ...
该库提供了一种机制,可以使Android应用程序中的Google Cloud Messaging快速运行。 它提供了检索GCM注册ID和挂钩以将其发送到您的后端所需的代码,还涵盖了PushBullet在发现的所有陷阱,以确保其可靠运行,包括在...
使用http request和socket实现的Android即时通讯应用 原始源码:https://code.google.com/p/simple-android-instant-messaging-application/ 最新源码:https://github.com/Pirngruber/AndroidIM
Instant-messaging信息提示源码 即时通讯实例,信息提示框! 转换页面的时候,在页面左下角显示待处理的信息提示框!
Android 自动消息演示 这是一个简单的演示应用程序,用于演示 Android Auto Messaging API 的用法。
2.1 The Android SDK 2.2 Fitting the pieces together 2.3 Building an Android application in Eclipse 2.4 The Android Emulator 2.5 Debugging 2.6 Summary Part 2 Exercising the Android SDK 3 User ...
《Android 4高级编程(第3版)》由Android权威专家编写,涵盖了所有最新的内容,是学习使用Android 4 SDK开发移动应用程序的理想指南。本书见解深刻,帮助经验丰富的Android开发人员充分挖掘Android 4的新特性的潜力,...
Android Cloud to Device Messaging Framework
A messaging library for Android A messaging library for Android A messaging library for Android 地址 :https://github.com/Slyce-Inc/SlyceMessaging
即时通信(Instant Messaging,IM)软件产生以来,这种通过网络与其它在线用户进行交流的方式,受到了个人公司以及行业的青睐。本文采用软件工程的管理和设计方法,对项目的需求进行了分析,完成了功能用例建模,使用...
Android 4高级编程(第3版)》由Android权威专家编写,涵盖了所有最新的内容,是学习使用Android 4 SDK开发移动应用程序的理想指南。《Android 4高级编程(第3版)》见解深刻,帮助经验丰富的Android开发人员充分挖掘...
参与数字Android示例应用程序这个Android Studio项目是一个示例应用程序,显示了如何使用 Messaging SDK。 Engage Digital provides a mobile messaging component that allows users of your appto easily ...
使用谷歌的GCM服务(Google Cloud Messaging)实现Android消息推送