`
hilary3113
  • 浏览: 266560 次
  • 性别: Icon_minigender_1
  • 来自: 邯郸
社区版块
存档分类
最新评论

[Android实例] Android2.1消息应用(Messaging)源码学习笔记

阅读更多
我想首先应该从AndroidManifest.xml文件开始,该文件是Android应用(APK)的打包清单,其中提供了关于这个应用程序的基本信息,如名称(application/@label),图标(application/@icon),等常量信息,但该文件最重要的功能仍然是:向Android系统声明应用程序所包含的组件,包括Activity、Service、Receiver和ContentProvider,另外还会请求系统授予相关权限。

<application>是重要的标记,通常我们都是在此设置应用程序的名称和图标,而在Messaging这个应用中,它扩展了默认的android.app.Application类,在com.android.mms.MmsApp类中覆写了onCreate()方法进行系统初始化、覆写onTerminate() 方法做相关清理工作。最重要的是<application>标记设置了(任务吸引力)
taskAffinity=“android.task.mms”、allowTaskReparenting="true" 这是两个与Task有关的属性,那么何为任务(Task)呢?

Application就是一个.apk文件,由若干个组件(可能会包括Activity、Service、Receiver或者ContentProvider)构成,它是一个物理上的独立存在。而Task则是指用户借助Application提供的功能完成某件事情,例如:发送一条信息给老朋友。通常一个Task操作所涉及的内容不会超过Application边界,但在Android中却不是这样,Android允许一个Task操作横跨多个Apllication。还以向老朋友发送信息为例,在该任务中,至少需要一个用来输入目标电话号码和消息内容的用户界面——即Android中的Activity组件(这是Messaging应用中的内容),如果进一步要求目标号码是从联系人列表(或通话列表)中选择,而非手工输入,那么就涉及到跨Apllication调用‘联系人应用’中的列表组件了(也是一个Activity)。因此以上两个属性前者设置了Activity的吸引力(Affinity)值,后者使得Activity可以在不同的Task中自有切换。



Messaging中的Receiver

Receiver广播接收器用于响应系统中的各种广播事件并执行相关业务代码的组件,常用于完成如:启动service、显示Activity等任务。在Messagin应用中一共有7个Receiver:
1、.transaction.SmsReceiver:短消息广播接收器,它负责处理与收到短消息相关的广播事件。触发该接收器运行的intent有两个:
A.android.intent.action.BOOT_COMPLETED--->Android系统启动完成时会发出该广播,即SmsReceiver会在系统启动完成时接收到调用;
B.com.android.mms.transaction.MESSAGE_SENT--->定义在
SmsReceiverService.java中的常量,被用在SmsMessageSender.sendMessage方法中——即短消息发送后 触发的广播事件;
完全和预想的一样,在SmsReceiver中会启动SmsReceiverService,启动代码在beginStartingService方法里。值得注意的是它同时还做了“屏幕唤醒锁定(WakeLock)” 操作,最终在service启动完成后,通过回调用finishStartingService方法,解除了屏幕唤醒锁定。
SmsReceiver.java中有编译错误,因为无法访问android.provider.Telephony.Sms.Intents。其实Intents所在位置是:myeclair\frameworks\base\core\java\android\provider\Telephony.java,它被标记为@hide。

2、
.transaction.PrivilegedSmsReceiver:该接收器是SmsReceiver的子类,唯一的区别在于该Receiver被申明有permission为android.permission.BROADCAST_SMS。


3、.transaction.MmsSystemEventReceiver
:Mms系统事件接收器,它负责 在收到新消息时 向通知区域(即标题栏)显示小图标,和 重新发送在发件箱中的MM。触发该接收器运行的两个Intent是:
A.android.intent.action.BOOT_COMPLETED--->:与SmsReceiver中的情况相同;
B.android.intent.action.CONTENT_CHANGED--->:连接方式改变时系统会发出该广播,即在连接方式变化,例如从gprs-->wifi时该接收器将被调用;
在MmsSystemEventReceiver类中,程序一旦获得数据连接时就会启动TransactionService服务;当连接方式改变时还会调用PduCache.purge()方法清理缓存;还有当系统刚刚启动时 会同步通知区域的图标、未读消息个数等信息。
MmsSystemEventReceiver.java中有编译错误,因为它无法访问以下类:
1、com.google.android.mms.util.PduCache:位置-myeclair\frameworks\base\core\java\com\google\android\mms\util\PduCache.java,该类未包含在默认的android.jar文件中,需要重新编译;
2、android.provider.Telephony.Mms:位置-myeclair\frameworks\base\core\java\android\provider\Telephony.java,该类被标记为@hide
3、com.android.internal.telephony.TelephonyIntents:位置-myeclair\frameworks\base\telephony\java\com\android\internal\telephony\TelephonyIntents.java,该类是一个常量类是未被开放的API。
4、com.android.internal.telephony.Phone:位置-myeclair\frameworks\base\telephony\java\com\android\internal\telephony\Phone.java,该类被标记为@hide

4、.transaction.PushReceiver

WAP_PUSH 事件的广播接收器,该事件发生时 代表手机收到了一条新的WAP PUSH message。该接收器被调用后,首先唤醒手机屏幕5秒钟,然后在一个后台线程中处理push-data,将消息数据插入到数据库中,必要时启动TransactionService服务以更新通知信息。触发该接收器运行的Intent是:
(intent.action=android.provider.Telephony.WAP_PUSH_RECEIVED, data=application/vnd.wap.mms-message),其中Action.Name定义在android.provider.Telephony类中。值得注意的是该Receiver有申明权限:android.permission.BROADCAST_WAP_PUSH,这意味着发出该广播时必须携带该授权,否则本Receiver将不会被触发执行。
PushReceiver.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中。

5、.
transaction.MessageStatusReceiver:消息状态改变时的广播接收器,消息状态改变是指消息的投递状态(即:是否成功送达、是否被目标用户阅读等)的变化,触发该接收器的Intent是:com.android.mms.transaction.MessageStatusReceiver. MESSAGE_STATUS_RECEIVED,该值是申明在MessageStatusReceiver.java文件中的常量。该广播事件是在SmsMessageSender.sendMessage()方法中被发出的,收到广播事件后,Receiver的会做两件事情:a-取得pdu数据包 更新消息状态(在updateMessageStatus方法中);b-更新通知区域的新消息指示信息 (在MessagingNotification.updateNewMessageIndicator()方法中)。
MessageStatusReceiver.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中。

6、.transaction.SimFullReceiver
:Sim卡短信存储空间满的事件通知,当系统发现Sim卡中存储短信的空间耗尽时会发出该广播事件。该接收器完成的工作是在通知区域显示相关信息,点击通知信息后,可以进入管理Sim卡中短消息的Activity界面。
SimFullReceiver.java中有编译错误,因为它无法访问android.provider.Telephony类,所在位置-myeclair\frameworks\base\core\java\android\provider\Telephony.java,该类被标记为@hide


7、.transaction.SmsRejectedReceiver
:短消息被拒绝时的事件接收器,当手机的存储空间不足时会拒绝接收新的短消息,当该事件发生时SmsRejectedReceiver被调用,它会检查确认是否是存储空间不足,然后在通知区域显示相关通知信息。
SmsRejectedReceiver.java中有编译错误,因为它无法访问android.provider.Telephony类,所在位置-myeclair\frameworks\base\core\java\android\provider\Telephony.java,该类被标记为@hide
这个世界这么脏,谁有资格说悲伤!!
 
   
Jessical 当前在线
阅读权限
50 
注册时间
2010-6-2 
最后登录
2011-2-16 
在线时间
164小时 
查看详细资料

Rank: 4

UID
33147 
精华
帖子
224 
e望
3 点 
e币
383 元 
在线时间
164小时 
2#
发表于 4 天前 |只看该作者
回复 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 消息应用(Messaging)源码学习笔记 在 Android 操作系统中,应用程序(APK)是由多个组件构成的,包括 Activity、Service、Receiver 和 ContentProvider。其中,AndroidManifest.xml 文件是 APK 的打包...

    Android Studio实例代码.zip_Android app实例_Android实例_android app源码_and

    本压缩包“Android Studio实例代码.zip”包含了多个Android app的实例源码,旨在帮助开发者深入理解并实践Android应用开发。 1. **Android Studio基础** Android Studio基于IntelliJ IDEA,提供了强大的代码编辑、...

    Android开发10个实例源码

    8. **通知与消息推送**:利用NotificationManager发送通知,或者集成Firebase Cloud Messaging(FCM)进行远程消息推送,是Android应用中常见的需求,实例可能包含这些内容。 9. **第三方库集成**:许多开发者会...

    Android创意实例详解书籍源码

    《Android创意实例详解》这本书籍源码的分享,旨在为Android开发者提供丰富的实践案例和学习资源。这份源码集合涵盖了Android应用开发中的多种创新技术与设计思路,是深入理解和掌握Android开发技能的理想辅助资料。...

    Android应用开发详解教材源码(下册)--实例源码

    在本资源中,"Android应用开发详解教材源码(下册)--实例源码" 提供了8个单元共计30多个实例的源代码,旨在帮助开发者深入理解Android应用程序的开发过程。这些实例覆盖了Android开发中的核心概念、组件以及最佳...

    Android应用源码之安卓应用市场app商店源码.rar

    在Android应用开发领域,源码分析是学习和提升技术能力的重要途径。本资源"Android应用源码之安卓应用市场app商店源码.rar"提供了一个实际的Android应用商店的源代码,这对于开发者来说是一个宝贵的参考资料。下面,...

    android邮箱开发实例源码

    这里我们主要探讨基于标题"android邮箱开发实例源码"和描述"《android应用开发深入学习实录》中邮箱开发的源码"的相关知识点。 1. **Android SDK与API使用**: 开发Android邮箱应用首先需要熟悉Android SDK,它是...

    Android应用开发实例源码

    在Android应用开发领域,实例源码是学习和提升技能的重要资源。通过分析和研究实际运行的应用代码,开发者能够深入理解Android系统的运作机制,以及如何利用Java或Kotlin语言构建功能丰富的移动应用程序。以下是对...

    Android消息推送实例加详细注释完整可运行的源码

    在Android应用开发中,消息推送是一项重要的功能,它能让用户即使在不打开应用程序的情况下也能收到新消息的通知。这个实例提供了一个完整的、可运行的源码,包含详细注释,非常适合初学者和开发者学习如何实现这一...

    Android开发实例:新浪微薄 内含源码及说明文档

    7. **通知服务**:对于实时性需求,如新消息提醒,应用可能需要集成Firebase Cloud Messaging(FCM)来实现推送通知。 8. **测试与调试**:源码中应包含单元测试和集成测试,以确保代码质量。使用Android Studio的...

    UMP Android iOS 1.7.2.1.rar

    本文将详细探讨UMP 1.7.2.1版本在Android和iOS平台上播放视频的技术要点,以及Unity中如何集成和使用这个插件。 首先,UMP 1.7.2.1.unitypackage是UMP的一个更新版本,它包含了适用于Android和iOS平台的视频播放...

    Android应用源码-Android安卓设计实例源代码51个合集.zip

    "Android应用源码-Android安卓设计实例源代码51个合集.zip" 文件提供了一个丰富的学习平台,包含了51个不同的Android应用实例源代码,这些实例涵盖了Android开发中的各种常见设计模式和技术。这个合集对于初学者和有...

    android实例教程

    【Android实例教程】是针对Android开发者的...通过学习这个【Android实例教程】,开发者不仅能掌握Android开发的基本技能,还能了解到最佳实践和常见问题的解决方案,从而提高编程效率,创作出高质量的Android应用。

    最详细的Android开发教程实例

    本教程"最详细的Android开发教程实例"旨在提供一个全面的学习路径,帮助新手和有经验的开发者深入理解Android开发的核心概念和技术。 【Android开发入门】: Android开发入门是学习Android编程的第一步。"101- ...

    spring-messaging源码

    在Spring生态中,Spring Messaging是一个重要的模块,它为构建消息驱动的应用提供了核心支持。本文将深入探讨Spring Messaging的源码,帮助开发者更好地理解和运用这个组件。 一、Spring Messaging简介 Spring ...

    Android 消息推送源码

    在Android应用开发中,消息推送是一项关键功能,它能让用户即使在不打开应用的情况下也能收到新消息的通知。这里我们关注的焦点是“Android消息推送源码”,这通常涉及到后台服务、通知栏通知以及Intent的使用等方面...

    精通ANDROID实例开发-高清.7z

    《精通ANDROID实例开发》这本书是Android开发者进阶的宝贵资源,尤其适合已经掌握了基础的Android编程知识并希望深化理解和实践应用的程序员。本书的核心在于通过丰富的实例,帮助读者深入理解Android平台上的应用...

    android核心技术与实例详解口袋微博项目源码

    8. **通知与消息推送**:Android的通知系统允许应用在状态栏显示提醒,而消息推送如Firebase Cloud Messaging (FCM)则可以实现实时通信。 9. **服务(Service)**:后台运行的服务可以执行长时间任务,即使用户离开...

    android应用源码(精)基于asmack开发的Android IM客户端源码

    本资料是关于基于Asmack开发的Android即时通讯(IM)客户端源码,适用于学习和设计参考。Asmack是一个开源的XMPP库,它允许开发者在Android平台上构建实时通信应用,如聊天、群聊、文件传输等功能。下面将详细探讨这...

    Android应用源码某国企安卓办公OA项目

    6. **通知与推送**:OA应用可能需要向用户发送消息通知,这涉及到了Android的通知系统以及可能的第三方推送服务如Firebase Cloud Messaging (FCM)。学习这部分可以帮助开发者理解如何实现实时的消息推送。 7. **...

Global site tag (gtag.js) - Google Analytics