美文网首页
Android N 四大组件的工作原理

Android N 四大组件的工作原理

作者: dennis_hys | 来源:发表于2017-12-08 22:35 被阅读0次

    本文侧重讲解android N 系统中四大组件的工作原理,不同系统原理略有差别。通过分析四大组件的工作流程加深对Android Framework的理解,也为插件化开发打下基础。

    四大组件的工作状态

    Activity
    展示一个界面并和用户交互,它扮演的是一个前台界面的角色。

    Service
    计算型组件,用于后台执行一系列计算任务,工作在主线程,耗时操作需要另起线程, 分为启动状态和绑定状态。

    BroadcastReceiver
    消息型组件,主要用于不同组件或者不同应用之间的消息传递,它工作在系统内部,不适合执行耗时操作,操作超过5s,会出现ANR。

    ContentProvider
    数据共享型组件,用于向其他组件或者应用共享数据,主要执行CURD操作。

    Activity工作原理

    我们启动一个activity有两种方法,
    第一种(Activity直接启动方式):
    Intent intent = new Intent(this, MainActivity.class);
    startActivity(intent);

    第二种(Context启动方式)
    Intent intent = new Intent(this, MainActivity.class);
    getApplicationContext().startActivity(intent);

    不同的启动方式Activity的工作流程有点差别。


    Activity UML流程图

    两种启动都会调用到Instrumentation类中的execStartActivity的方法,系统最终是通过ActivityThread中的performLaunchActivity完成Activity的创建和启动。
    performLaunchActivity方法主要完成以下工作:
    1、通过ActivityClientRecord对象获取启动activity的组件信息
    2、通过mInstrumentation对象的newActivity方法调用classloader完成activity的创建
    3、通过r.packageInfo(LoadedApk 对象)的makeApplication方法尝试创建Application对象
    4、创建ContextImpl对象并调用Activity的attach方法完成一些数据的初始化
    5、调用Activity的onCreate方法

    在Activity启动的过程中,App进程会频繁地与AMS进程进行通信:

    App进程会委托AMS进程完成Activity生命周期的管理以及任务栈的管理;这个通信过程AMS是Server端,App进程通过持有AMS的client代理IActivityManager完成通信过程;
    AMS进程完成生命周期管理以及任务栈管理后,会把控制权交给App进程,让App进程完成Activity类对象的创建,以及生命周期回调;这个通信过程也是通过Binder完成的,App所在server端的Binder对象存在于ActivityThread的内部类ApplicationThread;AMS所在client通过持有IApplicationThread的代理对象完成对于App进程的通信。

    image.png

    Service工作原理

    Service有两种启动方式,startService()和bindService(),两种状态可以并存:
    startService流程

    Service UML流程图1

    bindService流程

    Service UML流程图1

    BroadcastReceiver工作原理

    BroadcastReceiver的工作过程主要包括广播的注册、发送和接收:

    动态注册过程:

    动态注册过程

    发送过程


    发送广播过程

    静态注册是由PackageManagerService(PMS)在应用安装的时候完成整个注册过程的,除广播以外,其他三大组件也都是在应用安装时由PMS解析并注册的。

    ContentProvider工作原理

    每个进程的入口都是ActivityThead.main(),App的启动流程如下:

    APP启动流程

    从源码中可以看出:
    应用启动的入口为ActivityThread的main方法,main方法会创建ActivityThread实例并创建主线程消息队列。
    attach方法中远程调用AMS的attachApplication方法,并提供ApplicationThread用于和AMS的通信。
    attachApplication方法会通过bindApplication方法和H来调回ActivityThread的handleBindApplication,这个方法会先创建Application,再加载ContentProvider,然后才会回调Application的onCreate方法。

    Query过程

    由上图可以看出,在ContentProvider的启动过程中伴随着app进程的启动。

    ContentProvider的其他CURD操作如insert,delete,update跟query的流程类似。

    相关文章

      网友评论

          本文标题:Android N 四大组件的工作原理

          本文链接:https://www.haomeiwen.com/subject/uzxeixtx.html