其他分享
首页 > 其他分享> > Activity生命周期回调是如何被回调的?

Activity生命周期回调是如何被回调的?

作者:互联网

  作者:钟离四郎

  链接:

  https://www.jianshu.com/p/91984327690e

  本文由作者授权发布。

  像java程序有main方法作为入口一样,Android程序也有入口,ActivityThread的main方法就是Android程序的入口,如下图:

  接着看到调用ActivityThread的attach方法,如下:

  mAppThread对象究竟是什么类型呢?如下:

  回到 mgr.attachApplication(mAppThread);上图标记为B的地方,mgr本身是IActivityManager是一个接口,它的继承树结构如下图,上面我刚才提到mgr是系统服务ActivityManager的本地代理,所以这里mgr实际类型是Proxy,所以mgr.attachApplication(mAppThread)实际是调用的是Proxy里面的attachApplication方法,如下:

  如果 mgr.attachApplication(mAppThread)调用完成了之后,Android与系统服务ActivityManager之间“双工”通信信道就建立完毕了,为了方便你理解我画一个图,如下:

  上文我分析过ActivityManager系统服务在拥有ApplicationThread本地代理之后,就可以控制Android程序的主线程,比方说启动LaunchActivity,只要调用ApplicationThread本地代理的scheduleLaunchActivity则会引起Android程序ApplicationThread.Stub的scheduleLaunchActivity被调用

  你理解Binder的机制的话 ,这些其实都很好理解,如果你不理解的话可以看看我之前写的Binder机制文章:

  https://www.jianshu.com/p/5de1718454f8

  ApplicationThread.Stub的scheduleLaunchActivity方法如下:

  上图提到在加载Activity的时候,会在主线程调用sendMessage,下文就看看sendMessage里面有什么玄机,如下:

  mH.sendMessage(msg); 会导致ActivityThread.H的handleMessage被调用如下:

  上图C处代码跳转如下:

  D处代码跳转如下:

  可以看到在performLaunchActivity中首先是创建了一个Activity,然后调用

  mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);准备调用Activity的onCreat函数,我们进入这个方法看看是不是如此,如下:

  如上图看到的performCreat里面就是回调了Activity的onCreat方法,至此onCreate的回调流程就分析清楚了,接着回到上文标记E的地方还记得吗,不记得往上翻,是调用了 handleResumeActivity方法,看名字就知道这是Activity 的onResume相关的,onCreat都被调用了,接下来是OnResume,这和我们以前学习的Activity的生命周期很符合呀,嗯,不多说进去看看是什么情况:

  看到没,接下去的跳转和onCreate部分很相似,不再分析了,至此你应该知道Activity的生命周期是怎么被调用的吧,或许你还是有点模糊,那我下面帮你总结一下吧:

  1.首先在ActivityThread的主线程,生成一个ApplicationThread对象,这个对象式能够对外提供远程服务的,换句话说别的进程可以通过这个对象的本地代理与我这个ActivityThread的主线程(ApplicationThread对象)通信;

  2.获取系统服务ActivityManager的本地代理对象

  3.将生成的ApplicationThread对象通过ActivityManager的本地代理对象“发送”给系统服务ActivityManager,这样系统服务ActivityManager会"生成"ApplicationThread对象的本地代理,到此主线程与系统服务ActivityManager之间的“双工”通信信道就建立了

  4.当你想要启动一个Activity的时候,系统服务ActivityManager就会调用ApplicationThread对象的本地代理的scheduleLaunchActivity方法,这样主线程的scheduleLaunchActivity也会相应的被调用,至此开始了Activity生命周期函数的回调。

  代码较多,下面由我给大家再次简单总结下:

  Activity 的启动,实际上是一个进程间交互的过程,即本地app 与 AMS 交互,涉及到两点:

  本地app -> AMS : 给 AMS 各种参数,要求启动 Activity

  AMS -> 本地app : AMS处理完了,回调本地 app Activity 生命周期

  可以看到这两个进程间相互通信,那么就找 Binder 就好了,从app -> AMS,这个比较简单,通过 ServiceManager.getService 拿到 AMS 的代理对象(Binder)即可和 AMS 通信。

  而 AMS -> app 则如上文所说,我们在 ActivityThread 中创建了一个 ApplicationThread (Binder) 对象传递给 AMS 的。

  推荐阅读:

  AccessibilityService 你了解原理吗?

  推荐几个好用的 Studio 插件

  如何排查列表卡顿问题

  是时候来学习 Kotlin 了

  grepcode关了有段时间了,大家是如何阅读framework源码的呢? 欢迎留言,也准备给大家分享一波如何方便的阅读framework 代码,敬请期待

  大连妇科医院 http://www.dlwtrlyy.com/

  大连妇科医院医生团队 http://www.62671288.com/

标签:调用,ActivityManager,生命周期,本地,Activity,AMS,回调,ApplicationThread
来源: https://www.cnblogs.com/lll123/p/10716457.html