天天看點

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等等