四大组件的工作机制

参考资料

凯子哥带你学Framework-Activity启动过程全解析
框架层理解Activity生命周期
CSDN Activity.startActivity流程简介
LoopJing的framework


目录

  • 1)Activity的工作过程
  • 2)Service的工作过程

1)Activity的工作过程

processon.com
  • Activity启动过程调用链(调用举例:Launcher启动Activity)
Launcher.startActivitySafely->    
Launcher.startActivity->   

 //要求在新的Task中启动此Activity    
 //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)    
 Activity.startActivity->    
 Activity.startActivityForResult->    

 //当startActivityForResult()调用之后实际还是调用Instrumentation
 Instrumentation.execStartActivity-> 


// ********通过Binder通知AMS准备启动Activity******** 

  // ActivityManagerNative.getDefault()返回AMS Proxy接口
///class ActivityManagerProxy implements IActivityManager{}
//public final class ActivityManagerService extends ActivityManagerNative{}
//public abstract class ActivityManagerNative extends Binder implements IActivityManager{}
  ActivityManagerNative.getDefault().startActivity->    
  ActivityManagerProxy.startActivity->     

   ActivityManagerService.startActivity-> (AMS)    
   ActivityManagerService.startActivityAsUser->  

    ActivityStack.startActivityMayWait->    
    ActivityStack.resolveActivity(获取ActivityInfo)   
       //aInfo.name为main Activity,如:com.my.test.MainActivity    
      //aInfo.applicationInfo.packageName为包名,如com.my.test    
    ActivityStack.startActivityLocked->    
      //ProcessRecord callerApp; 调用者即Launcher信息    
      //ActivityRecord sourceRecord; Launcher Activity相关信息    
      //ActivityRecord r=new ActivityRecord(...),将要创建的Activity相关信息      
    ActivityStack.startActivityUncheckedLocked->    
     //Activity启动方式:ActivityInfo.LAUNCH_MULTIPLE/LAUNCH_SINGLE_INSTANCE/    
     //             ActivityInfo.LAUNCH_SINGLE_TASK/LAUNCH_SINGLE_TOP)    
     // 创建一个新的task,即TaskRecord,并保存在ActivityRecord.task中    
     //r.setTask(new TaskRecord(mService.mCurTask, r.info, intent), null, true)    
     // 把新创建的Activity放在栈顶       
     ActivityStack.startActivityLocked->    
     ActivityStack.resumeTopActivityLocked->    
     ActivityStack.startPausingLocked (使Launcher进入Paused状态)->

   
// ********AMS通过Binder通知Launcher进入Paused状态******** 
ApplicationThreadProxy.schedulePauseActivity->     
//private class ApplicationThread extends ApplicationThreadNative {}
//public abstract class ApplicationThreadNative extends Binder implements IApplicationThread{}
//class ApplicationThreadProxy implements IApplicationThread {}
ApplicationThread.schedulePauseActivity->  

  ActivityThread.queueOrSendMessage->    
  // 调用Activity.onUserLeaveHint    
  // 调用Activity.onPause    
  // 通知activity manager我进入了pause状态    
  ActivityThread.handlePauseActivity-> 


// ****Launcher通过Binder告诉AMS,它已经进入Paused状态 ****
ActivityManagerProxy.activityPaused->    
ActivityManagerService.activityPaused->    
ActivityStack.activityPaused->(把Activity状态修改为PAUSED)    
ActivityStack.completePauseLocked-> 
ActivityStack.resumeTopActivityLokced-> 


//***AMS创建一个新的进程,用来启动一个ActivityThread实例***
//***即将要启动的Activity就是在这个ActivityThread实例中运行***
ActivityStack.startSpecificActivityLocked->  
ActivityManagerService.startProcessLocked->    

// 启动一个新的进程    
// 新的进程会导入android.app.ActivityThread类,并且执行它的main函数,    
// 即实例化ActivityThread, 每个应用有且仅有一个ActivityThread实例    
Process.start("android.app.ActivityThread",...)->   
//通过socket向zygote进程发送创建新进程的请求, 通过zygote机制fork创建一个新的进程    
Process.startViaZygote->  

// 这个函数在进程中创建一个ActivityThread实例,然后调用    
// 它的attach函数,接着就开启消息循环,创建ActivityThread.H(Handler)   用于接收ApplicationThread发送的消息
ActivityThread.main-> 

//首先获取AMS在客户端的代理,ActivityManagerNative.getDefault()[方法内部从ServiceManager.getService("activity"),然后将此Binder asInstance为IActivityManager]
//然后***ActivityThread通过Binder将一个ApplicationThread类的Binder对象传递给AMS,以便AMS通过此Binder对象来控制Activity整个生命周期 ***
ActivityThread.attach->    
IActivityManager.attachApplication(mAppThread)->    
ActivityManagerProxy.attachApplication->    
ActivityManagerService.attachApplication-> 

  // 把在ActivityManagerService.startProcessLocked中创建的ProcessRecord取出来
  ActivityManagerService.attachApplicationLocked->

//***AMS通过Binder通知ActivityThread一切准备OK,它可以真正启动新的Activity了 ***
ActivityStack.realStartActivityLocked->    
ApplicationThreadProxy.scheduleLaunchActivity->    
ApplicationThread.scheduleLaunchActivity->
    
ActivityThread.handleLaunchActivity-> {
  // 加载新的Activity类,并执行它的onCreate    
  ActivityThread.performLaunchActivity    
    /*1) Instrumentation.newActivity: 加载新类,即创建Activity对象;  
    2) ActivityClientRecord.packageInfo.makeApplication:创建Application对象;  
        <LoadedApk.makeApplication>  
    3) Activity.attach(Context context, ActivityThread aThread,  
                    Instrumentation instr, IBinder token, int ident,  
                    Application application, Intent intent, ActivityInfo info,  
                    CharSequence title, Activity parent, String id,  
                    NonConfigurationInstances lastNonConfigurationInstances,  
                    Configuration config):
        把Application attach到Activity, 即把Activtiy相关信息设置到新创建的Activity中  
    4) Instrumentation.callActivityOnCreate:调用onCreate;*/    

  // 使用Activity进入RESUMED状态,并调用onResume    
  `ActivityThread.handleResumeActivity  }
  • 总结:
    • 客户端打开Activity通过Binder通知AMS准备启动
    • AMS通过Binder通知当前Activity进入Paused状态
    • 当前Activity通过Binder告诉AMS已准备完毕
    • AMS判断目标Activity对象是否存在:
      • 存在则直接ActivityThread.handleResumeActivity
      • 不存在,则判断Activity所在进程是否存在:
        • 进程不存在:创建进程,实例化ActivityThread,启动Activity
        • 进程存在:在该进程中ActivityThread.handleLaunchActivity
总结

主要类图

2)Service的工作过程

http://www.jianshu.com/p/05b5e4cfb5d9

屏幕快照 2017-08-02 下午4.51.13.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容