Activity启动的工作过程知识点

参考任玉刚老师的书籍和这篇博客Android源码分析-Activity的启动过程和这篇Android Activity学习笔记——Activity的启动和创建学习笔记。

一Activity概念:
android的核心不是application,而是activity,至少我们开发的时候是这样的;
activity就是被用来进行与用户交互和用来与android内部特性交互的组件。在应用程序中用到的所有activity都需要在配置文件中进行设置。那么activity又是怎样的一种组件呢,怎么样进行显示交互的呢,一个activity实例时如何被管理和运行起来的呢,activity的生命周期又是怎么一回事呢。
二Activity框架和管理结构:
Activity管理的核心是ActivityManagerService,是一个独立的进程;
ActiveThread是每一个应用程序所在进程的主线程,循环的消息处理。
ActivityThread和ActivityManagerService的通信是属于进程间通信,使用Binder机制;如图所示:

三Activity启动过程
以启动一个应用程序startActivity为例,看一下代码执行的大概流程:

补充知识点:
ApplicationThread是ActivityThread的一个内部类,通过
Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                        this, mMainThread.getApplicationThread(), mToken, this,
                        intent, -1, options, user);
通过这个mTinstrumentation.execStartActivity()这个方法去执行下面的一个方法:
int result = ActivityManagerNative.getDefault()
                .startActivityAsUser(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target != null ? target.mEmbeddedID : null,
                        requestCode, 0, null, null, options, user.getIdentifier());
通过上面的方法,可以看出来,启动Activity真正的实现是由ActivityManagerNative.getDefault()的startActivity方法来完成。而AcitivityManagerService(简称AMS)继承ActivityManagerNative,而ActivityManagerNative继承自Binder接口,因此AMS也是一个Binder,它是IActivityManager的具体实现。由于ActivityManagerNative.getDefault()其实是一个IActivitymanager类型的Binder对象,因此它的具体实现是AMS。也就是说Acitivity的启动过程在AMS中(因为 ActivityManagerNative.getDefault()就是一个AMS实例 )下面分析AMS中启动Activity的startActivity()这个方法。从IApplicationThread声明的接口方法可以看出,其内部包含了大量的Activity启动,停止Activity的接口,还包含了大量的服务的启动和停止接口,这也说明IApplicationThread这个Binder接口完成了大量和Activity以及Service启动停止相关的功能。Activity的启动过程最终回到了ApplicationThread中,ApplicationThreadThread通过scheduleLaunchActivity这个方法来启动Activity。
代码如下:
<pre name="code" class="java">public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,  
        ActivityInfo info, Configuration curConfig, CompatibilityInfo compatInfo,  
        int procState, Bundle state, List<ResultInfo> pendingResults,  
        List<Intent> pendingNewIntents, boolean notResumed, boolean isForward,  
        String profileName, ParcelFileDescriptor profileFd, boolean autoStopProfiler) {  
  
    updateProcessState(procState, false);  
  
    ActivityClientRecord r = new ActivityClientRecord();  
  
    r.token = token;  
    r.ident = ident;  
    r.intent = intent;  
    r.activityInfo = info;  
    r.compatInfo = compatInfo;  
    r.state = state;  
  
    r.pendingResults = pendingResults;  
    r.pendingIntents = pendingNewIntents;  
  
    r.startsNotResumed = notResumed;  
    r.isForward = isForward;  
  
    r.profileFile = profileName;  
    r.profileFd = profileFd;  
    r.autoStopProfiler = autoStopProfiler;  
  
    updatePendingConfiguration(curConfig);  
  
    queueOrSendMessage(H.LAUNCH_ACTIVITY, r);  
} 
 
 
代码30,又关联了消息机制。后面还有很多。能看懂一点再补。

可以将其分为6个过程:
1使用代理模式启动到ActivityManagerService进程中执行。
2. 通过ActivityStack创建activiityRecord到mHistory记录中。
3.通过socket通信到Zgote相关类创建process。
4.通过ApplicationThread与ActivityManagerService建立通信。
5.ActivityManagerService通知ActiveThread启动Activity的创建。
6.ActivityThread创建Activity加入到mActivityes中并开始执行
详情看下图:
并不是所有启动一个Activity都是这样的过程:一个应用程序中所有Activity只有一个ActivityThread属于一个Process;ActivityStack并不是每次都需要一个Stack来管理Activites;
下面看看android系统中的四个重要概念:
Application:由多个相关的松散的与用户交互的Activity组成,通常被打包成以apk结尾的文件中。
Acitivitys:应用程序的主要组成部分,是应用程序的核心。
ActivityStack:将应用程序中打开的Acitivity保存在历史栈中,按照栈先进后出原则进行管理,start Activity时入栈,返回时出栈。
Task:将一系列相关的Activity组合,完成某个应用程序的完整操作,不管Activity属于哪个Application;

四:Activity启动流程类结构分析:
1.ActivityService相关类
使用了Proxy的代理模式:ActiivityManagerProxy代理ActivityManagerService,并为之提供了公共的访问接口:IActivityManager。
2, Activity启动
3.ActivityStack管理
ActivityStack创建并存储系列创建的 Activity实例,将其入栈管理mHistory;
4.ActivityThread
是应用程序的主线程,消息循环的执行者,其中很多的内部类来完成工作。
ActivityThread使用内部类:ApplicationThread与ActivityManagerService进行通信,ActivityThread将状态变化传递控制客户端activity的状态执行。
mActivits保存由ActivityStack所创建的ActivityRecord相关实例的引用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值