zoukankan      html  css  js  c++  java
  • Android中app的启动步骤

    Step 1

    Launcher通过Binder机制通知ActivityManagerService(AMS),它要启动一个Activity;

    Step 2

    AMS通过Binder机制通知Launcher进入Paused状态;

    Step 3

    Launcher通过Binder机制通知AMS,它已经准备就绪进入Paused,于是AMS就创建一个新的进程用来启动一个ActivityThread实例,即将要启动的Activity就是在这个ActivityThread实例中运行;

    Step 4

    ActivityThread通过Binder机制将一个ApplicaionThread类型的Binder对象传递给AMS,以便以后AMS能够通过这个Binder对象和它进行通信;

    Step 5

    AMS通过Binder机制通知ActivityThread,现在一切ready,它可以真正执行Activity的启动操作了;

    下面我们再来想想这个问题:AMS是怎么找到启动的那个activity的?

    我们先来了解下Activity,Window的中Token:参考

    • ActivityClientRecord

      这个类是Activity在ActivityThread中一一对应的,一个APP有多个Activity, 也就是说有多个ActivityClientRecord, 那么当AMS要启动一个Activity的时候,怎么样找到APP中正确的那个Activity呢?答案就是通过Token,如: 

    public final ActivityClientRecord performResumeActivity(IBinder token,
                boolean clearHide, String reason) {
            ActivityClientRecord r = mActivities.get(token);
            r.activity.performResume();
    }

    先通过token找到ActivityClientRecord,然后再通过ActivityClientRecord中的activity就找到了正确的Activity了。

    • Activity

      Activity中Token主要用于在请求AMS服务时用于定位到具体到AMS中正确的ActivityRecord;

      比如进入PIP模式,通过Token,AMS就可以知道具体是哪个Activity进入PIP;

      又比如 startActivityForResult,希望在finish时得到一些结果,那么AMS在finish那个Activity时,会把result传递给resultTo(mToken对应的那个Activity);

    • Window

      Window中的Token主要是传给LayoutParams;

  • 相关阅读:
    hdu6229 Wandering Robots 2017沈阳区域赛M题 思维加map
    hdu6223 Infinite Fraction Path 2017沈阳区域赛G题 bfs加剪枝(好题)
    hdu6438 Buy and Resell 买卖物品 ccpc网络赛 贪心
    hdu6441 Find Integer 求勾股数 费马大定理
    bzoj 1176 Mokia
    luogu 3415 祭坛
    bzoj 1010 玩具装箱
    bzoj 3312 No Change
    luogu 3383【模板】线性筛素数
    bzoj 1067 降雨量
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/10381494.html
Copyright © 2011-2022 走看看