一探究竟Activity的过程

        好像工作了这么久,从来没去追究过Android是从哪里启动的,所以最近带着这个疑问来看了看源码。也和大家分享一下这个知识。

1.Activity是什么?

    Activity是Android组件中最基本也是最为常见用的四大组件之一。

2.Activity的生命周期?

下面的是常见的Activity的生命周期图;

一探究竟Activity的过程_第1张图片
Activity生命周期图

Android的状态的介绍:

onCreate: 表示Activity的创建,生命周期的第一个方法,可以在此方法中进行初始化的操作(加载布局资源、初始化Activity所需要的数据等)切记,耗时的工作要创建异步线程来完成;

onStart: 与onStop配对,表示Activity正在被启动,并且即将开始。但是这个时候要注意它与onResume的区别。两者都表示Activity可见,但是onStart时Activity还正在加载其他内容,正在向我们展示,用户还无法看到,即无法交互。

onRestart: 表示Activity正在重新启动。一般情况下,在当前Activity从不可见重新变为可见的状态时onRestart就会被调用。这种情形一般是由于用户的行为所导致的,比如用户按下Home键切换到桌面或者打开了一个新的Activity(这时当前Activity会暂停,也就是onPause和onStop被执行),接着用户有回到了这个Activity,就会出现这种情况。

onResume: 与onPause配对,表示Activity已经创建完成,并且可以开始活动了,这个时候用户已经可以看到界面了,并且即将与用户交互(完成该周期之后便可以响应用户的交互事件了)。

onPause: 与onResume配对,表示Activity正在暂停,正常情况下,onStop接着就会被调用。在特殊情况下,如果这个时候用户快速地再回到当前的Activity,那么onResume会被调用(极端情况)。一般来说,在这个生命周期状态下,可以做一些存储数据、停止动画的工作,但是不能太耗时,如果是由于启动新的Activity而唤醒的该状态,那会影响到新Activity的显示,原因是onPause必须执行完,新的Activity的onResume才会执行。

onStop: 表示Activity即将停止,可以做一些稍微重量级的回收工作,同样也不能太耗时(可以比onPause稍微好一点)。

onDestroy: 与onCreate配对,表示Activity即将被销毁,这是Activity生命周期的最后一个回调,我们可以做一些回收工作和最终的资源释放(如Service、BroadReceiver、Map等)。

下面做一些简单的分析和生命周期的启动方式:

1.正常创建一个activity的生命周期:

onCreate—>onStart—>onResume

正常启动Activity的生命周期方法调用

2.当用户按返回键后的生命周期

onPause—>onStop—>onDestroy

点击返回键正常Activity退出的生命周期方法调用

3.点击MainActivity中button启动另外的SecondActivity的时候,生命周期调用方法

MainActivity生命周期的onPause—>SecondActivity的onCreate—>SecondActivity的onStart—>SecondActivity的onResume—>MainActivity的onStop

一探究竟Activity的过程_第2张图片
点击按钮启动另外的activity的生命周期方法

4.在上面的情境下,我们推出SecondActivity,看看两个生命周期的变化如何?

SecondActivity: onPause—>MainActivity: onRestart—>MainActivity: onStart—>MainActivity: onResume—>SecondActivity: onStop—>SecondActivity:onDestroy

一探究竟Activity的过程_第3张图片
退出SecondActivity的生命周期方法

5.现在看看一个activity的切换横竖屏幕的时候生命周期变化,当前为竖屏,切换横屏

MainActivity: onPause—>MainActivity: onStop—>MainActivity: onDestroy—>MainActivity: onCreate—>MainActivity: onStart—>MainActivity: onResume

一探究竟Activity的过程_第4张图片
切换横竖屏的时候的生命周期方法

切换横竖屏幕的时候,生命周期销毁又重新创建了,这个是我们大多数情况下很不愿意看见的啊,如何才能不让其生命周期发生变化呢?

1.在AndroidMe.xml 的标签中增加android:configChanges="orientation|keyboardHidden|screenSize"

2.禁止竖屏或者禁止横屏

在AndroidManifest.xml的activity中加入:

横屏:android:screenOrientation="landscape"

竖屏:android:screenOrientation="portrait"

3.还可以在activity中重写onConfigurationChanged方法;(详情就不介绍了)

3.Activity的启动模式及应用场景?

1)Standard模式:默认模式,会在启动时创建一个新实例,创建的模式也可以随Intent.FLAG_ACTIVITY_NEW_TASK而改变。

应用场景:绝大多数Activity。

2)SingleTop模式:当启动activity时,有相同的activity在前台与用户交互,那就复用这个activity,这个实例会被调用Activity.onNewIntent()。

应用场景:在通知栏点击收到的通知,然后需要启动一个Activity,这个Activity就可以用singleTop,否则每次点击都会新建一个Activity。

3)SingleTask模式:在启动activity时,若有一个运行着这个activity的task,那这个activity实例会被调到前台,并调用Activity.onNewIntent() ,启动实例的Intent的flag会被设置Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT 。

应用场景:大多数App的主页

4)SingleInstance模式:开辟一个只允许一个activity实例在里头运行的task. 如果用同样的intent再次启动这个activity,task会被调到前台,其Activity.onNewIntent() 会被调用. 如果这个activity实例要启动一个新activity,那么这个新activity会在一个新task中运行。

应用场景:呼叫来电界面。这种模式的使用情况比较罕见,在Launcher中可能使用。或者你确定你需要使Activity只有一个实例。建议谨慎使用。

4.Activity的启动过程?

        启动过程,那就是讲Android应用是如何启动的,简单的描述一下,点击手机中的应用图标,这样,这个应用就启动起来了。

       看似很简单的,实则这个过程很是复杂,下面我就从源码的角度给大家分享一下我所看到的吧(有什么不对之处请指出);

点击图标启动,实则是启动了一个Launcher.java的类,这个类继承了Activity类。

一探究竟Activity的过程_第5张图片
Launcher.java中的onCreate方法一
一探究竟Activity的过程_第6张图片
Launcher.java中的onCreate方法一

这个方法有点长,暂时用2个图来表达:看到内部的上面一些初始化和一些条件的判断,我们主要看下面的这个地方;在图二的下方有两个方法(showFirstRunActivity和showFirstRunClings) 我们看看这两个方法中做了什么?

一探究竟Activity的过程_第7张图片
showFirstRunActivity
一探究竟Activity的过程_第8张图片
showFirstRunClings

如图所示,是不是看到我们所熟悉的startActivity方法呢,这个是启动一个activity的方法,看看他的内部实现吧;

Activity类中的startActivity方法

一探究竟Activity的过程_第9张图片
startActivity

实现了内部的startActivity方法,2个参数,看看下面的实现,这可是一个追踪的过程;

一探究竟Activity的过程_第10张图片
startActivity2参数
一探究竟Activity的过程_第11张图片
startActivityForResult
一探究竟Activity的过程_第12张图片
startActivityForResult具体实现

追踪到这里,看看具体实现内容:

好像和这个Instrumentation类有关系,看看这个吧,找到这个类中的execStartActivity方法看看

一探究竟Activity的过程_第13张图片
execStartActivity

a).ActivityManagerNative.getDefault().startActivity 这个方法看来是真正执行启动activity的东西

b).在execStartActivity中还看到一个检查方法checkStartActivityResult;

一探究竟Activity的过程_第14张图片
checkStartActivityResult

想必从这个开始,就开启了一个应用的启动过程了。并不要以为这个就完了,下面我们要看看程序的入口在哪里了;

5.Android程序的入口

        类比一下,java的程序入口是main方法,那我们Android的程序入口在哪里呢?

        直接来讲吧,看看ActivityThread.java这个类,在这个类中发现了main方法;豁然开朗啊,激动的泪花都出来了;

一探究竟Activity的过程_第15张图片
main方法

在ActivityThread方法中,看看thread.attach方法

一探究竟Activity的过程_第16张图片
ActivityManagerNative

IActivityManager是什么呢?真的是破案,一点一点追踪,下面再找找这个类;

IActivityManager是个接口,我们看看他的实现方法ActivityManagerNative.getDefault()这个;

一探究竟Activity的过程_第17张图片
gDefault.get();

get方法,我找找gDefault 是Singleton抽象类的抽象方法,好像又回到了最初;

一探究竟Activity的过程_第18张图片
Singleton

还是看看抽象类中的实现吧;

一探究竟Activity的过程_第19张图片
Singleton gDefault

还是得看看IActivityManager中的实现方法 asInterface这个方法,具体看下图

一探究竟Activity的过程_第20张图片
asInterface

最终返回值是ActivityManagerProxy 类,这个类是ActivityManagerNative 类的内部实现类了;

ActivityManagerNative 实现了一个IBinder,看到这里,我后面会单独的研究IBinder方法;

一探究竟Activity的过程_第21张图片
IBinder

写到这里,忽然不知道如何向下继续,IBinder这个很复杂,单独的抽出来一节来讲吧,了解了Activity的启动,生命周期,入口等,我希望可以帮助大家更好的理解activity,我也想更好的和大家进行交流;喜欢的点个赞,我的公众号也可以关注一下;


一探究竟Activity的过程_第22张图片

你可能感兴趣的:(一探究竟Activity的过程)