九、四大组件的工作过程

1.四大组件的运行状态

Android中的四大组件除了BroadcastReceiver之外,其他三大组件都必须在Manifest里面注册,对于BroadcastReceiver来说,它既可以在Manifest里面注册,也可以通过代码来注册。
在调用方式上面,Activity,Service,BroadcastReceiver需要借助Intent,而ContentProvider则无需借助Intent。

Activity是一种展示型组件,用于向用户直接地展示一个界面,并且可以接收用户的输入信息从而进行交互。

Service是一种计算型组件,用于在后台执行一系列计算任务。Service有两种状态,启动状态和绑定状态。当处于启动状态的时候,Service内部可以做一些后台计算,而且不需要和外界有直接的交互。当处于绑定状态的时候,Service内部同样可以做一些后台计算,但是处于这种状态时外界可以很方便地和Service组件进行通信。
注意:尽管Service组件是执行后台计算的,但是它本身是运行在主线程中的,因此耗时的后台计算仍然需要在单独的线程中去完成。

BroadcastReceiver是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息。由于BroadcastReceiver的特性,它不适合用来执行耗时操作,BroadcastReceiver组件一般来说不需要停止,也没有停止的概念。

ContentProvider是一种数据共享型组件,用于向其他组件乃至其他应用共享数据。它的内部需要实现增删改查这四种操作,在它的内部维持着一份数据集合,这一个数据集合既可以通过数据库来实现,也可以采用其他任何类型来实现,比如List和Map,ContentProvider对数据集合的具体实现并没有任何要求。
注意: ContentProvider内部的insert,delete,update,query方法需要处理好线程同步,因为这几个方法是在Binder线程池中被调用的,另外ContentProvider也不需要手动停止。

2.Activity的工作过程

Activity真正的启动是调用ActivityManagerService的startActivity方法。
AMS中转移到ActivityStackSupervisor的startActivityMayWait方法。
Activity的启动在ActivityStackSupervisor与ActivityStack之间的传递顺序
Activity的启动在ActivityStackSupervisor与ActivityStack之间的传递顺序

最终由ApplicationThread的scheduleLaunchActivity方法来启动Activity。发送一个启动Activity的消息交给Handler处理,Handler的名字叫H。

最终Activity的启动过程由ActivityThread的handleLaunchActivity方法实现,最后调用performLaunchActivity方法。

    private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
        ...
        if (localLOGV) Slog.v(
            TAG, "Handling launch of " + r);
        // Initialize before creating the activity
        WindowManagerGlobal.initialize();
        Activity a = performLaunchActivity(r, customIntent);
        if (a != null) {
            r.createdConfig = new Configuration(mConfiguration);
            Bundle oldState = r.state;
            handleResumeActivity(r.token, false, r.isForward,
                    !r.activity.mFinished && !r.startsNotResumed);
        ...
        }
    ...
    }

通过handleResumeActivity方法来调用被启动Activity的onResume这一生命周期方法。

performLaunchActivity方法主要完成了以下几件事:
2.1.从ActivityClientRecord中获取待启动的Activity组件信息;
2.2.通过Instrumentation的newActivity方法使用类加载器创建Activity对象;
2.3.通过LoadedApk的makeApplication方法来尝试创建Application对象;
2.4.创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化;
2.5.调用Activity的onCreate方法.

3.Service的工作过程

Service分为两种工作状态,一种是启动状态,主要是用于执行后台计算,另一种
是绑定状态,主要用于和其他组件和Service的交互。需要注意的是,Service的
这两种状态是可以共存的,即Service既可以处于启动状态,也可以同时处于绑定
状态。
3.1.Service的启动过程
3.2.Service的绑定过程

4. BroadcastReceiver的工作过程

4.1.广播的注册过程
广播的注册分为静态注册和动态注册,其中静态注册的广播在应用安装时由系统自动完成注册,具体来说是由PMS(PackageManagerService)来完成整个注册过程的,除了广播之外,其他三大组件也都是在应用安装时由PMS解析并注册的。
4.2.广播的发送和接收过程

5.ContentProvider的工作过程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值