解決如何監聽Activity切換
來源:程序員人生 發布時間:2014-09-18 03:29:56 閱讀次數:5199次
本篇博文在我之前的博文中已經提到了,但是監聽Activity切換又可以作為一個單獨的內容來敘述,因此這里又單獨拿了出來進行贅述。
Activity的切換無非有兩種,第一種:啟動或者創建一個新的Activity;第二種:喚醒后臺運行的Activity。因此如果我們能夠成功監聽到啟動或者創建一個Activity,或者喚醒Activity我們就基本完成了Activity的切換的監聽。
在源碼/frameworks/base/core/java/android/app目錄下ActivityThread.java中為我們提供了這樣一個方法來幫助我們完成對Activity啟動、創建、銷毀、暫停、停止,喚醒等生命周期的監聽。
-
public void handleMessage(Message msg) {
-
if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
-
switch (msg.what) {
-
case LAUNCH_ACTIVITY: {
-
-
if ( true == mEnableAppLaunchLog && !mIsUserBuild && false == mTraceEnabled ) {
-
try {
-
FileInputStream fprofsts_in = new FileInputStream("/proc/mtprof/status");
-
if ( fprofsts_in.read()== '3' ) {
-
Log.v(TAG, "start Profiling for empty process");
-
mTraceEnabled = true;
-
Debug.startMethodTracing("/data/data/applaunch");
-
}
-
} catch (FileNotFoundException e) {
-
Slog.e(TAG, "mtprof entry can not be found", e);
-
} catch (java.io.IOException e) {
-
Slog.e(TAG, "mtprof entry open failed", e);
-
}
-
}
-
-
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER | Trace.TRACE_TAG_PERF, "activityStart");
-
ActivityClientRecord r = (ActivityClientRecord)msg.obj;
-
-
r.packageInfo = getPackageInfoNoCheck(
-
r.activityInfo.applicationInfo, r.compatInfo);
-
handleLaunchActivity(r, null);
-
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER | Trace.TRACE_TAG_PERF);
-
} break;
-
case RELAUNCH_ACTIVITY: {
-
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityRestart");
-
ActivityClientRecord r = (ActivityClientRecord)msg.obj;
-
handleRelaunchActivity(r);
-
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
-
} break;
-
case PAUSE_ACTIVITY:
-
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
-
handlePauseActivity((IBinder)msg.obj, false, msg.arg1 != 0, msg.arg2);
-
maybeSnapshot();
-
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
-
break;
-
case PAUSE_ACTIVITY_FINISHING:
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈