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