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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章