天天看点

Activity生命周期启动流程启动模式

Activity

1、activity启动流程:

————》点击App的icon

————》在Laucher的onClick方法中,调用startActivitySafely方法(Laucher继承于Activity)

————》startActivitySafely方法中携带一个intent,intent中包含着我们在AndroidManifest.xml注册的

                  action ="android.intent.action.Main",category="android.intent.category.Launcher",该方法中intent添加FLAG, 

                  Intent.FLAG_ACTIVITY_NEW_TASK表示要在一个新的Task中启动这个Activity

————》 Activity.startActivity

————》Activity.startActivityForResult(intent, -1),传-1表示不需要返回

public void startActivityForResult(Intent intent, int requestCode) {
		if (mParent == null) {
			Instrumentation.ActivityResult ar =
				mInstrumentation.execStartActivity(
				this, mMainThread.getApplicationThread(), mToken, this,
				intent, requestCode);
			......
		} else {
			......
		}
}
           

Intrumentation是Activity的一个成员变量,它用来监控应用程序和系统的交互;

mMainThread是ActivityThread类型的成员变量,它是一个Binder对象,ActivityManagerService会使用它来和ActivityThread来进

行进程间通信;

mToken也是Activity类的成员变量,它是一个Binder对象的远程接口。

————》Instrumentation.execStartActivity

public ActivityResult execStartActivity(
	Context who, IBinder contextThread, IBinder token, Activity target,
	Intent intent, int requestCode) {
		IApplicationThread whoThread = (IApplicationThread) contextThread;
		if (mActivityMonitors != null) {
			......
		}
		try {
			int result = ActivityManagerNative.getDefault()
				.startActivity(whoThread, intent,
				intent.resolveTypeIfNeeded(who.getContentResolver()),
				null, 0, token, target != null ? target.mEmbeddedID : null,
				requestCode, false, false);
			......
		} catch (RemoteException e) {
		}
		return null;
	}
           

ActivityManagerNative.getDefault返回ActivityManagerService(Binder机制的核心)的远程接口ActivityManagerProxy。

————》 ActivityManagerProxy.startActivity

————》ActivityManagerService.startActivity

2、生命周期

生命周期方法:

oncreate()——>onstart()——>onResume()——>onRestart()——>onPause()——>onStop()——>onDestory()

四种状态:

————》running:当前显示在屏幕的activity(位于任务栈的顶部),用户可见状态;

                  starting——>running执行方法:oncreate()——>onstart()——>onResume()

————》paused:依旧在用户可见状态,但是界面焦点已经失去,此Activity无法与用户进行交互;

                  running——>paused执行方法:onPause()

                  Paused ——>Running执行方法:onResume()

————》stopped:用户看不到当前界面,也无法与用户进行交互 完全被覆盖;

                  paused——>stopped执行方法:onStop()

————》killed:当前界面被销毁,等待这系统被回收。

                 stopped——>killed执行的方法:onDestroy()

A Activity跳转B Activity之后finish():

A执行生命周期:onCreate()——>onStart()——>onResume()——>onPouse() 

B执行生命周期:onCreate()——>onStart()——>onResume() 

A执行生命周期:onStop()——>onDestory()

A Activity弹出B Activity(dialog形式)

A执行生命周期:onCreate()——>onStart()——>onResume()

B执行生命周期:onCreate()——>onStart()——>onResume() 

3、启动模式

Actiivty启动四大模式:

standard:标准默认模式,需要一个创建一个,常规启动;

SingleTop:栈顶复用模式,需要的Activity在栈顶直接复用,如果不存在或者不在栈顶,创建一个。使用场景:登录,通知栏等;

SingleTask:栈内复用模式,需要的Activiy在栈内存在销毁其栈顶activity,自己称为栈顶复用,调用其onNewIntent方法。使用场景:程序主入口MainActivity,Webview页面等;

SingleInstance:全局单例模式,此模式的Activity单独位于一个任务栈中。使用场景:系统应用如来电提醒、系统Laucher等等