近来回顾了一下关于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的关系图可以表示如下:
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。
部分内容转自:
Android中ActivityManagerService与应用程序(客户端)通信模型分析
Android应用框架之Activity
总结:Activity的诞生: startActivity->ActivityManagerService->HistoryRecord->ApplicationThread->ActivityThread->onCreate(Activity)
本文仅供学习和参考,如有错误请指出,谢谢。转载请注明出处