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之间的通信。

  • 相关阅读:
    C++ 将对象写入文件 并读取
    IronPython fail to add reference to WebDriver.dll
    How to Capture and Decrypt Lync Server 2010 TLS Traffic Using Microsoft Tools
    .net code injection
    数学系学生应该知道的十个学术网站
    Difference Between Currency Swap and FX Swap
    Swift开源parser
    谈谈我对证券公司一些部门的理解(前、中、后台)[z]
    JDK8记FullGC时候Metaspace内存不会被垃圾回收
    JVM源码分析之JDK8下的僵尸(无法回收)类加载器[z]
  • 原文地址:https://www.cnblogs.com/fankongkong/p/7484835.html
Copyright © 2011-2022 走看看