zoukankan      html  css  js  c++  java
  • Activity的启动

    --摘自《android插件化开发指南》

    1.AMS管理着四大组件

    2.为什么Hook不能在AMS那边?因为AMS属于android系统,android系统可以被Hook,那就是病毒了。四大组件被Hook,只会影响某一个app

    3.手机屏幕就是一个Activity,所在的app被称为Launcher,是由手机厂商提供的

    4.Android app的main函数在ActivityThread里面

    5.如果写了个Activity而忘记在AndroidManifest中申明,就会抛出Activity not found的错误,是因为AMS做的检查。不管是新启动一个app的首页,还是在app内部跳转activity,都会做这个检查

    第一步:

    Launcher通知AMS要启动的app和首页activity

    Launcher.startActivitySafely() -->  Activity.startActivity() -->  Activity.startActivityForResult()  -->  instrumentation.execStartActivity() -->  ActivityManagerNative.startActivity() -->  ActivityManagerProxy.startActivity()

     第二步:

    AMS通知Launcher已经收到启动信息

    因为第一步中Launcher所在进程已经传给AMS,AMS保存为一个ActivityRecord对象,这个对象里面有一个ApplicationThreadProxy,就是Binder代理对象,它的binder真身,就是ApplicationThread

    所以,AMS通过ApplicationThreadProxy发送消息,而App端则通过ApplicationThread来接收这个消息  

     第三步:

    Launcher告诉AMS知道了

    这一步中,APT接收到来自AMS的消息后,调用ActivityThread的sendMessage方法,想Launcher主线程消息队列发送一个PAUSE_ACTIVITY消息

    前三步是Launcher和AMS相互之间的跨进程通信,很类似网络协议通信的三次握手

    第四步:

    接下来就是AMS和待启动app之间的通信了

    因为待启动的app不在后台进程,所以要启动一个新的进程。调用Process.start(),并指定ActivityThread的main函数为入口函数

    第五步:

    启动一个新进程,为这个进程创建ActivityThread对象(UI线程)

    1)创建一个主线程Looper,即MainLooper

    2)创建Application

    最后AMS收到这个新的ActivityThread对象,登记成功

    第六步:

    AMS把传入的ActivityThread对象转为一个ApplicationThread对象,用于和这个app跨进程通信。AMS找到第二步中保存的启动首页的信息,告诉新的app

    第七步:

    app通过APT接受AMS的消息,通过H的handleMessage发送的消息类型是LAUNCH_ACTIVITY

    handleLaunchActivity方法做的事

    1)通过Instrumentation的newActivity方法,创建要启动的Activity实例

    2)为这个Activity创建一个Context对象,与Activity关联

    3)通过Instrumentation的callActivityOnCreate方法,执行Activity的onCreate方法

    好了,简单总结一下流程

    1.Launcher通知AMS要启动的app和首页activity

    2.AMS通知Launcher已经收到启动信息

    3.Launcher告诉AMS知道了

    4.AMS启动一个新的进程

    5.AMS为新进程创建一个主线程

    6.AMS告诉新的app该启动哪个Activity

    7.app启动首页

    其中1/2/3/6都是跨进程通信

    另外,如果是App内部的页面跳转,因为AMS在第四步时会发现要启动的Activity和前一个Activity在同一个进程中,所以就不用新建一个新的进程了,这样第四步、第五步就省略掉了,其他的步骤一模一样。

  • 相关阅读:
    platform cannot apply stanford theme
    汉化、用户创建
    修改字段
    语言包格式错误引起组件崩溃
    配置LMS/Studio SMTP
    Javascript如何实现AOP
    【转】组件化的Web王国
    【转】前端组件化框架之路
    【转】ES6 手册
    【转】超实用的JavaScript技巧及最佳实践
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/10079488.html
Copyright © 2011-2022 走看看