一探究竟Activity的过程
好像工作了这么久,从来没去追究过Android是从哪里启动的,所以最近带着这个疑问来看了看源码。也和大家分享一下这个知识。
1.Activity是什么?
Activity是Android组件中最基本也是最为常见用的四大组件之一。
2.Activity的生命周期?
下面的是常见的Activity的生命周期图;
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的生命周期方法
4.在上面的情境下,我们推出SecondActivity,看看两个生命周期的变化如何?
SecondActivity: onPause—>MainActivity: onRestart—>MainActivity: onStart—>MainActivity: onResume—>SecondActivity: onStop—>SecondActivity:onDestroy
退出SecondActivity的生命周期方法
5.现在看看一个activity的切换横竖屏幕的时候生命周期变化,当前为竖屏,切换横屏
MainActivity: onPause—>MainActivity: onStop—>MainActivity: onDestroy—>MainActivity: onCreate—>MainActivity: onStart—>MainActivity: onResume
切换横竖屏的时候的生命周期方法
切换横竖屏幕的时候,生命周期销毁又重新创建了,这个是我们大多数情况下很不愿意看见的啊,如何才能不让其生命周期发生变化呢?
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类。
这个方法有点长,暂时用2个图来表达:看到内部的上面一些初始化和一些条件的判断,我们主要看下面的这个地方;在图二的下方有两个方法(showFirstRunActivity和showFirstRunClings) 我们看看这两个方法中做了什么?
如图所示,是不是看到我们所熟悉的startActivity方法呢,这个是启动一个activity的方法,看看他的内部实现吧;
Activity类中的startActivity方法
实现了内部的startActivity方法,2个参数,看看下面的实现,这可是一个追踪的过程;
追踪到这里,看看具体实现内容:
好像和这个Instrumentation类有关系,看看这个吧,找到这个类中的execStartActivity方法看看
a).ActivityManagerNative.getDefault().startActivity 这个方法看来是真正执行启动activity的东西
b).在execStartActivity中还看到一个检查方法checkStartActivityResult;
想必从这个开始,就开启了一个应用的启动过程了。并不要以为这个就完了,下面我们要看看程序的入口在哪里了;
5.Android程序的入口
类比一下,java的程序入口是main方法,那我们Android的程序入口在哪里呢?
直接来讲吧,看看ActivityThread.java这个类,在这个类中发现了main方法;豁然开朗啊,激动的泪花都出来了;
在ActivityThread方法中,看看thread.attach方法
IActivityManager是什么呢?真的是破案,一点一点追踪,下面再找找这个类;
IActivityManager是个接口,我们看看他的实现方法ActivityManagerNative.getDefault()这个;
get方法,我找找gDefault 是Singleton抽象类的抽象方法,好像又回到了最初
还是看看抽象类中的实现吧;
还是得看看IActivityManager中的实现方法 asInterface这个方法,具体看下图
最终返回值是ActivityManagerProxy 类,这个类是ActivityManagerNative 类的内部实现类了;
ActivityManagerNative 实现了一个IBinder,看到这里,我后面会单独的研究IBinder方法;
写到这里,忽然不知道如何向下继续,IBinder这个很复杂,单独的抽出来一节来讲吧,了解了Activity的启动,生命周期,入口等,我希望可以帮助大家更好的理解activity,我也想更好的和大家进行交流;喜欢的点个赞,我的公众号也可以关注一下;
上一篇: 生活小幽默,伴你过周未.
下一篇: 服务器是由哪些硬件构成的?带你一探究竟!