zoukankan      html  css  js  c++  java
  • 四大组件的工作过程

    1、四大组件的运行状态                                          

    Android的四大组件中除了BroadcastReceiver以外,其他三种组件都必须在AndroidManifest中注册,对于BroadcastReceiver来说,既可以在AndroidManifest中注册也可以通过代码来注册。

    在调用方式上,Activity,Service和BroadcastReceiver需要借助Intent,而ContentProvider则无须借助Intent。

    Activity组件的主要作用是展示一个界面并和用户交互,扮演的是一种前台界面的角色。

    在实际开发中通过Activity的finish方法来结束一个Activity组件的运行。

    Activity组件只有一种运行模式,即Activity处于启动状态。

    Service是一种计算型组件,用于在后台执行一系列计算任务。

    Service组件有两种状态:启动状态和绑定状态。

    当Service处于启动状态时,这个时候Service内部可以做一些后台计算,并且不需要和外界有直接的交互。但是耗时的后台计算仍然需要在单独的线程中去完成。

    当Service处于绑定状态时,这个时候Service内部同样可以进行后台计算,但是处于这种状态时外界可以很方便地和Service组件进行通信

    BroadcastReceiver是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息。

    静态广播:指在AndroidManifest中注册广播,这种广播在应用安装时会被系统解析,此种形式的广播不需要应用启动就可以收到相应的广播。

    动态广播:需要通过Context.registerReceiver()来实现,并且不需要的时候要通过Context.unRegisterReceiver()来解除广播。广播不适合执行耗时操作。BroadcastReceiver组件一般来说不需要停止,也没有停止的概念。

    ContentProvider是一种数据共享型组件,用于向其他组件乃至其他应用共享数据。

    2、Activity的工作过程                                          

    Activity的启动过程。

    Activity的startActivity方法有好几种重载方式,但它们最终会调用startActivityForResult方法。

    ApplicationThread是ActivityThread的一个内部类。

    启动Activity真正的实现由ActivityManagerNative.getDefault()的startActivity方法来实现。

    ActivityManagerService继承自ActivityManagerNative,而ActivityManagerNative继承自Binder并实现了IActivityManager这个Binder接口,因此AMS是一个Binder,它是IActivityManager的具体实现。

    performLaunchActivity方法最终完成了Activity对象的创建和启动过程,并且ActivityThread通过handleResumeActivity方法来调用被启动Activity的onResume这一生命周期方法。

    performLaunchActivity这个方法主要完成了以下5件事:

    a、从ActivityClientRecord中获取待启动的Activity的组件信息;

    b、通过Instrumentation的newActivity方法使用类加载器创建Activity对象;

    c、通过LoadedApk的makeApplication方法来尝试创建Application对象。

    d、创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化;

    e、调用Activity的onCreate方法。

    3、Service的工作过程                                          

    启动状态:主要用于执行后台计算;

    绑定状态:主要用于其他组件和Service的交互。

    这两种状态可以共存。

    通过Context的startService方法可以启动一个Service:

    Intent intentService = new Intent(this,MyService.class);

    startService(intentService);

    通过Context的bindService方法即可以绑定的方式启动一个Service:

    Intent intentService = new Intent(this,MyService.class);

    bindService(intentService,mServiceConnection,BIND_AUTO_CREATE);

    Service的启动过程从ContextWrapper的startService开始。

    Service的绑定过程从ContextWrapper的bindService开始。

    4、BroadcastReceiver的工作过程                      

    动态注册的广播需要在合适的时机进行解注册,采用unregisterReceiver方法。

    广播的静态注册由PMS(packageManagerService)来完成整个注册过程。

    动态注册过程是从ContextWrapper的registerReceiver方法开始的,和Activity和Service一样。

    广播的发送有几种类型:普通广播、有序广播和粘性广播。

    广播的发送开始于ContextWrapper的sendBroadcast方法,由ContextImpl去处理,ComtextImpl直接向AMS发起一个异步请求用于发送广播。

    5、ContentProvider的工作过程                           

    ContentProvider的onCreate方法要先于Application的onCreate方法执行。

    当一个应用启动时,入口方法是ActivityThread的main方法,main方法是一个静态方法,在main方法中创建ActivityThread的实例并创建主线程的消息队列,然后再ActivityThread的attach方法中远程调用AMS的attachApplication方法并将ActivityThread对象提供给AMS。

    ActivityThread是一个Binder对象,它的Binder接口是IApplicationThread,主要用于ActivityThread和AMS之间的通信。

  • 相关阅读:
    剑指OFFER----面试题54. 二叉搜索树的第k大节点
    剑指OFFER----面试题53
    剑指OFFER----面试题53
    DevExpress ASP.NET Core v19.1版本亮点:Visual Studio集成
    Kendo UI for jQuery使用教程:初始化jQuery插件
    代码自动补全插件CodeMix全新发布CI 2019.7.15|改进CSS颜色辅助
    MyEclipse使用教程:使用工作集组织工作区
    DevExpress ASP.NET Core v19.1版本亮点:Pivot Grid控件等
    Kendo UI for jQuery使用教程:小部件DOM元素结构
    MyEclipse使用教程——使用DevStyle Icon Designer(二)
  • 原文地址:https://www.cnblogs.com/fankongkong/p/7484835.html
Copyright © 2011-2022 走看看