2. 消息的发送

应用程序的主线程准备就好消息队列并且进入到消息循环后,其它地方就可以往这个消息队列中发送消息了。我们继续以文章开始介绍的Android应用程序启动过程源代码分析一文中的应用程序启动过为例,说明应用程序是如何把消息加入到应用程序的消息队列中去的。

在Android应用程序启动过程源代码分析这篇文章的Step 30中,ActivityManagerService通过调用ApplicationThread类的scheduleLaunchActivity函数通知应用程序,它可以加载应用程序的默认Activity了,这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:

  1. publicfinalclassActivityThread{
  2. ......
  3. privatefinalclassApplicationThreadextendsApplicationThreadNative{
  4. ......
  5. //weusetokentoidentifythisactivitywithouthavingtosendthe
  6. //activityitselfbacktotheactivitymanager.(mattersmorewithipc)
  7. publicfinalvoidscheduleLaunchActivity(Intentintent,IBindertoken,intident,
  8. ActivityInfoinfo,Bundlestate,List<ResultInfo>pendingResults,
  9. List<Intent>pendingNewIntents,booleannotResumed,booleanisForward){
  10. ActivityClientRecordr=newActivityClientRecord();
  11. r.token=token;
  12. r.ident=ident;
  13. r.intent=intent;
  14. r.activityInfo=info;
  15. r.state=state;
  16. r.pendingResults=pendingResults;
  17. r.pendingIntents=pendingNewIntents;
  18. r.startsNotResumed=notResumed;
  19. r.isForward=isForward;
  20. queueOrSendMessage(H.LAUNCH_ACTIVITY,r);
  21. }
  22. ......
  23. }
  24. ......
  25. }

这里把相关的参数都封装成一个ActivityClientRecord对象r,然后调用queueOrSendMessage函数来往应用程序的消息队列中加入一个新的消息(H.LAUNCH_ACTIVITY),这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:

  1. publicfinalclassActivityThread{
  2. ......
  3. privatefinalclassApplicationThreadextendsApplicationThreadNative{
  4. ......
  5. //ifthethreadhasn'tstartedyet,wedon'thavethehandler,sojust
  6. //savethemessagesuntilwe'reready.
  7. privatefinalvoidqueueOrSendMessage(intwhat,Objectobj){
  8. queueOrSendMessage(what,obj,0,0);
  9. }
  10. ......
  11. privatefinalvoidqueueOrSendMessage(intwhat,Objectobj,intarg1,intarg2){
  12. synchronized(this){
  13. ......
  14. Messagemsg=Message.obtain();
  15. msg.what=what;
  16. msg.obj=obj;
  17. msg.arg1=arg1;
  18. msg.arg2=arg2;
  19. mH.sendMessage(msg);
  20. }
  21. }
  22. ......
  23. }
  24. ......
  25. }

在queueOrSendMessage函数中,又进一步把上面传进来的参数封装成一个Message对象msg,然后通过mH.sendMessage函数把这个消息对象msg加入到应用程序的消息队列中去。这里的mH是ActivityThread类的成员变量,它的类型为H,继承于Handler类,它定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:

  1. publicfinalclassActivityThread{
  2. ......
  3. privatefinalclassHextendsHandler{
  4. ......
  5. publicvoidhandleMessage(Messagemsg){
  6. ......
  7. switch(msg.what){
  8. ......
  9. }
  10. ......
  11. }
  12. ......
  13. }

这个H类就是通过其成员函数handleMessage函数来处理消息的了,后面我们分析消息的处理过程时会看到。

更多相关文章

  1. Android使用xutils3框架实现应用程序内的检查更新下载服务器存放
  2. Android开发实践:自定义带消息循环(Looper)的工作线程
  3. 深入理解Android消息处理系统――Looper、Handler、Thread
  4. Android作为服务端,PC推送消息
  5. Android之MessageQueue、Looper、Handler与消息循环

随机推荐

  1. android 屏幕自适应
  2. FFmpeg交叉编译
  3. android基础(对话框风格Activity实现)
  4. android LinearLayout 垂直滚动
  5. Android 清除默认launcher 改为其他的lau
  6. 3G调试笔记之发送AT命令和APN配置
  7. Android studio attribute android:fillC
  8. sadasd
  9. API 23 inputmethodservice.KeyboardView
  10. Android:Android(安卓)Studio配置Kotlin