由浅入深理解Activity的诞生


近来回顾了一下关于Activity的生命周期,参看了相关书籍和官方文档,也有了不小的收获,对于以前的认知有了很大程度上的改善,在这里和大家分享一下。

总所周知,Activity的生命周期(onCreate,onStart,onResume,onPause,onStop,onRestart,onDestroy)

 

上图是经典的activity生命周期图,相信不少朋友也都看过。
简单的说,在一个activity创建的时候生命周期顺序onCreate->onStart->onResume,在activity关闭的时候onPause->onStop->onDestroy。当处于栈顶的activity(当前可见的activity),打开新的activity的时候,新的activity透明或部分遮挡当前activity,执行onPause(),完全遮挡执行onStop。而打开新的activity不是瞬间覆盖当前activity,而是具有动画效果的渐入,所以先执行onPause再onStop。

知道了Activity的生命周期,那么Activity是怎么执行onCreate的呢?

进入Activity的onCreate方法中看到

<span style="font-family:Microsoft YaHei;color:#333333;"> protected void onCreate(@Nullable Bundle savedInstanceState) {
        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);
        if (mLastNonConfigurationInstances != null) {
            mAllLoaderManagers = mLastNonConfigurationInstances.loaders;
        }
        if (mActivityInfo.parentActivityName != null) {
            if (mActionBar == null) {
                mEnableDefaultActionBarUp = true;
            } else {
                mActionBar.setDefaultDisplayHomeAsUpEnabled(true);
            }
        }
        if (savedInstanceState != null) {
            Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
            mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
                    ? mLastNonConfigurationInstances.fragments : null);
        }
        mFragments.dispatchCreate();
        getApplication().dispatchActivityCreated(this, savedInstanceState);
        if (mVoiceInteractor != null) {
            mVoiceInteractor.attachActivity(this);
        }
        mCalled = true;
    }</span>


看到关键地方getApplication().dispatchActivityCreated(this, savedInstanceState);

再来看Application的dispatchActivityCreated方法

<span style="font-family:Microsoft YaHei;color:#333333;">  /* package */ void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) {
            for (int i=0; i<callbacks.length; i++) {
                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
                        savedInstanceState);
            }
        }
    }</span>

 

<span style="font-family:Microsoft YaHei;color:#333333;">  public interface ActivityLifecycleCallbacks {
        void onActivityCreated(Activity activity, Bundle savedInstanceState);
        void onActivityStarted(Activity activity);
        void onActivityResumed(Activity activity);
        void onActivityPaused(Activity activity);
        void onActivityStopped(Activity activity);
        void onActivitySaveInstanceState(Activity activity, Bundle outState);
        void onActivityDestroyed(Activity activity);
    }</span>

 

从上面代码可以看出,Activity的创建是后于Application的onCreate。也就是说onCreate(Application)->onCreate(Activity),而dispatchActivityCreated是作为管理Activity的存在。

那么疑问又来了,Application又是什么时候执行的呢?

这时,我们需要了解AMS----ActivityManagerService,ActivityThread,ApplicationThread三个类。

 

ActivityManagerService.java  简称为 AMS 功能有:管理所有应用程序的Activity 、内存管理等 。

       路径位于: \frameworks\base\services\java\com\android\server\am\ActivityManagerService.java

       说明:该类是一个Binder类,即可实现跨进程通信。因此可以接受从客户端,例如Instrumentation、Context等调用过来的

           信息。ActivityManagerService提供了全局的代理对象,供IPC调用。

 

ActivityThread.java    路径位于:\frameworks\base\core\java\android\app\ActivityThread.java

         说明: 该类为应用程序(即APK包)所对应进程(一个进程里可能有多个应用程序)的主线程类,即我们通常所说的UI线程。

           一个ActivityThread类对应于一个进程。最重要的是,每个应用程序的入口是该类中的static main()函数 。

 ApplicationThread类是ActivityThread的内部类:

       说明:该类是一个Binder类,即可实现跨进程通信。主要用于接受从AMS传递过来的消息,继而做相应处理。

AMS与ActivityThread的通信模型图如下:

 

 

从该模型图我们得知以下知识点:
 
       第一、 引起调用AMS的对象通常有Context 、 Instrumentatio、ActivityThread等 。
       第二、当AMS接受到来自某个应用程序传来的消息后,在AMS内部处理完毕后,会通过Binder机制回调回该应用程序
             所在ApplicationThread服务端类,即ActivityThread.java类。
       第三、当ActivityThread接受到AMS传递过来的消息后,进行内部处理。如果需要的话,会继续与AMS通信。
       最后,当整个通信完成时,ActivityThread会选择合适的对象,例如Service、Activity、BroadcastReceiver等去做相应的
            处理。

 

 

最后我们需要知道,AcitityThread接收到AMS的是什么消息,以及接收到消息之后,会怎么做?

 

在整个系统中,Activity实际上有两个实体。一个在应用进程中跟应用程序员打交道的Activity,一个是在AMS的中具有管理功能的History Record。应用进程中的Activity都登记ActivityThread实例中的mActivity数组中,而在AM端,HistroytRecord实例放置在mHistroy栈中。mHistory栈是Android管理Activity的场所,放置在栈顶的就是User看到的处于活动状态的Activity。
Activity与HistrotyRecord的关系图可以表示如下:

image_thumb6

       Activity的内核实体是依靠在ProcessRecord的成员变量中,通过ProcessRecord我们可以访问到所有的属于该Process的Activity。而在ProcessRecord记录了与应用进程之间的联系:IActivtityThread接口。通过该接口,可以访问到所对应的Activity的方法。在Launch Activity时,AMS将对应的HistoryRecord作为token传递到客服端和客服端的Activity建立联系。在AMS中Activity状态变化时,将通过该联系找到客服端的Activity,从而将消息或者动作传递应用程序面对的接口:xxxActivity。
1)发起请求startActivity(intent)
2)Activity Service Manager接收到请求执行StartActivity函数。
      建立:HistoryRecord实例r.
      将r 加入到mHistory顶。
(3)通过app.thread.scheduleLaunchActvity( app,r)@ActivityThread.java
(4)在App应用中建立新的ActivityRecord。
(5)建立新的Activity对象并放入到ActivityRecord中。
(6)将ActivityRecord加入到mActivites@ActivityThread
(7)发起Activity.onCreate(..),,该onCreate就是在你的应用程序XXXActivity中的onCreate。

  image_thumb10

 

 

部分内容转自:

Android中ActivityManagerService与应用程序(客户端)通信模型分析

Android应用框架之Activity

 

总结:Activity的诞生:  startActivity->ActivityManagerService->HistoryRecord->ApplicationThread->ActivityThread->onCreate(Activity)

本文仅供学习和参考,如有错误请指出,谢谢。转载请注明出处

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值