• Android Activity


    1.Activity的启动和通信原理

      对于做App的开发人员而言,Activity是四大组件中用的最多的,也是最复杂的,

    a。App是怎么启动的。

      在手机屏幕上点击某个App的Icon,这个App的首页(或引导页)就出现在我们面前了。实际上是Activity和AMS的反反复复的通信过程。

          首先要搞清楚,在手机屏幕上点击App的icon快捷图标,此时手机屏幕就是一个Activity,而这个Activity所在的App,业界称之为Launcher(不是我们app的launcher)。Launcher是手机系统厂商提供的,类似小米华为这样的手机,比拼的就是谁的Launcher绚丽和人性化。

          Launcher这个App,其实和我们做的各类应用类App没有什么不同,我们大家用过华为、小米之类的手机,预装App以及我们下载的各种App,都显示在Launcher上,每个App表现为一个Icon。Icon多了可以分页,可以分组,此外,Launcher也会发起网络请求,调用天气的数据,显示在屏幕上,所谓的人性化界面。

    我们的第一个页 action and category 是重点

    而Launcher中为每个App的icon提供了启动这个App所需要的Intent信息,如下所示(比如说斗鱼的包名是):

    action:android.intent.action.MAIN

    category: android.intent.category.LAUNCHER

    cmp(ComponentName): 斗鱼的包名+ 首页Activity名

    这些信息是App安装(或Android系统启动)的时候,PackageManagerService从斗鱼的apk包的manifest文件中读取到的。

    仔细看,我们会发现,Launcher和斗鱼是两个不同的App,他们位于不同的进程中,它们之间的通信是通过Binder完成的——这时候AMS出场了。

      1. Launcher通知AMS,要启动斗鱼App,而且指定要启动斗鱼的哪个页面(也就是首页)。
      2. AMS通知Launcher,好了我知道了,没你什么事了,同时,把要启动的首页记下来。
      3. Launcher当前页面进入Paused状态,然后通知AMS,我睡了,你可以去找斗鱼App了。
      4. AMS检查斗鱼App是否已经启动了。是,则唤起斗鱼App即可。否,就要启动一个新的进程。AMS在新进程中创建一个ActivityThread对象,启动其中的main函数。
      5. 斗鱼App启动后,通知AMS,说我启动好了。
      6. AMS翻出之前在第二步存的值,告诉斗鱼App,启动哪个页面。
      7. 斗鱼App启动首页,创建Context并与首页Activity关联。然后调用首页Activity的onCreate函数。

    这里插一句:ActivityManagerService 简称AMS,是Android内核的核心功能之一,在系统启动SystemServer时启动此服务。

    Activity Manager的组成主要分为以下几个部分:

       1.服务代理:由ActivityManagerProxy实现,用于与Server端提供的系统服务进行进程间通信

      2.服务中枢:ActivityManagerNative继承自Binder并实现IActivityManager,它提供了服务接口和Binder接口的相互转化功能,并在内部存储服务代理对像,并提供了getDefault方法返回服务代理

      3.Client:由ActivityManager封装一部分服务接口供Client调用。ActivityManager内部通过调用ActivityManagerNative的getDefault方法,可以得到一个ActivityManagerProxy对像的引用,进而通过该代理对像调用远程服务的方法

       4.Server:由ActivityManagerService实现,提供Server端的系统服务

    AMS提供的功能主要包括以下几个方面:

       1。对于Android四大组件(activity service broadcast content provider)的管理,包括启动,生命周期管理等

        2.进程OOM adj以级LRU weight管理

    至此启动流程完成,分成两部分,Launcher和AMS相互通信(Launcher通知AMS启动那个APP),斗鱼App和AMS(AMS去创建新的进程启动APP)相互通信。

    第1阶段 Launcher通知AMS

    ps:ActivityThread代表了App应用程序,其实,Application对我们App开发人员来说也许很重要,但是在Android系统中还真的没那么重要,他就是个上下文。Activity不是有个Context上下文吗?Application就是整个ActivityThread的上下文。Android App的main函数,在ActivityThread里面,而这个类是Android系统提供的底层类,不是我们提供的。Android App的入口是Mainifest中定义默认启动Activity。这是由Android AMS与四大组件的通信机制决定的。

    所以点击icon就启动了斗鱼App中的首页。

          关注本人公众号获取更多干货.

  • 相关阅读:
    golang切片使用append追加内容导致切片值异常问题
    golang对通道进行select,case生效异常问题
    golang defer未按预期顺序执行
    GO实现无锁队列
    mysql建表报错:Specified key was too long
    右键快捷键
    算法与数据结构基础<三>----数据结构基础之栈和队列加强之用栈实现队列
    ios从入门到放弃之C基础巩固-----数组、字符串
    获取股票数据【使用JQData查询行情数据、财务指标、估值指标】
    IDEA配置.gitignore不生效的问题
  • 原文地址:https://www.cnblogs.com/wangandroid/p/7687666.html
Copyright © 2020-2023  润新知