Android原始碼分析 Activity的啟動過程

2021-08-31 18:24:27 字數 3777 閱讀 2032

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

是android中乙個很重要的概念,堪稱四大元件之首,關於activity有很多內容,比如生命週期和啟動flags,這二者想要說清楚,恐怕又要寫兩篇長文,更何況分析它們的原始碼呢。不過本文的側重點不是它們,我要介紹的是乙個activity典型的啟動過程,本文會從原始碼的角度對其進行分析。我們知道,當startactivity被呼叫的時候,可以啟動乙個activity,但是你知道這個activity是如何被啟動的嗎?每個activity也是乙個物件,你知道這個物件是啥時候被建立的嗎(也就是說它的構造方法是什麼時候被呼叫的)?為什麼oncreate是activity的執行入口?所有的這一切都被系統封裝好了,對我們來說是透明的,我們使用的時候僅僅是傳遞乙個intent然後startactivity就可以達到目的了,不過,閱讀了本文以後,你將會了解它的背後到底做了哪些事情。在分析之前,我先介紹幾個類:

instrumentation:用來輔助activity完成啟動activity的過程

首先看入口

code:activity#startactivity

@override

public

void

startactivity

(intent intent)

@override

public

void

startactivity

(intent intent, bundle options)

else

說明:顯然,從上往下,最終都是由startactivityforresult來實現的

接著看code:activity#startactivityforresult

public

void

startactivityforresult

(intent intent, int requestcode, bundle options)

else      break;    }   }  } } try catch (remoteexception e)  return

null;}

說明:我想再說一下這個方法checkstartactivityresult,它也專業拋異常的,看**,相信大家對下面的異常資訊不陌生吧,就是它幹的,其中最熟悉的非unable to find explicit activity class莫屬了,如果你在xml中沒有註冊目標activity,此異常將會丟擲。

說明:上述**很好理解,構造乙個activity記錄,然後傳送乙個訊息,所以,我們要看看handler是如何處理這個訊息的,現在轉到這個handler,它有個很短的名字叫做h

code:activitythread#h

//這個類太長,我只帖出了我們用到的部分

private

class

hextends

handler

// make sure we are running with the most recent config. handleconfigurationchanged(null, null); if (locallogv) slog.v(  tag, "handling launch of " + r); //終於到底了,大家都有點不耐煩了吧,從方法名可以看出,

//performlaunchactivity真正完成了activity的調起,

//同時activity會被例項化,並且oncreate會被呼叫 activity a = performlaunchactivity(r, customintent); if (a != null)     if (!r.activity.mcalled)    } catch (supernotcalledexception e) catch (exception e)    }   r.paused = true;  } } else catch (remoteexception ex)  }}

說明:關於原activity和新activity之間的狀態同步,如果大家感興趣可以自己研究下,因為邏輯太複雜,我沒法把所有問題都說清楚,否則就太深入細節而淹沒了整體邏輯,研究原始碼要的就是清楚整體邏輯。下面看最後乙個方法,這個方法是activity的啟動過程的真正實現。

code:activitythread#performlaunchactivity

private activity performlaunchactivity

(activityclientrecord r, intent customintent)

//其實就是通過activity的無參構造方法來new乙個物件,物件就是在這裡new出來的。  activity = minstrumentation.newactivity(    cl, component.getclassname(), r.intent);  strictmode.incrementexpectedactivitycount(activity.getclass());  r.intent.setextrasclassloader(cl);  if (r.state != null)  } catch (exception e)    r.activity = activity;   r.stopped = true;   if (!r.activity.mfinished)    if (!r.activity.mfinished)    }   if (!r.activity.mfinished)    }  }  r.paused = true;  mactivities.put(r.token, r); } catch (supernotcalledexception e) catch (exception e)  } return activity;}

相信當你看到這裡的時候,你對activity的啟動過程應該有了乙個感性的認識。activity很複雜,特性很多,本文沒法對各個細節進行深入分析,而且就算真的對各個細節都進行了深入分析,那文章要有多長啊,還有人有耐心看下去嗎?希望本文能夠給大家帶來一些幫助,謝謝大家閱讀。 

給我老師的人工智慧教程打call!

Android 訊息機制原始碼分析

threadlocal 乙個執行緒內部的資料儲存類,可以在指定執行緒中儲存資料,資料儲存以後,只有在指定執行緒中可以獲取到儲存的資料。先看下以下 主要是重寫了initialvalue方法 請看下面的原始碼 test public void test abc system.out.println th...

android 執行緒池原始碼分析

一直覺得這塊比較複雜,原因在於需要對資料結構和多執行緒開發比較熟悉。現在從threadpoolexecutor 出發。先看這個建構函式。public threadpoolexecutor int corepoolsize,int maximumpoolsize,long keepalivetime,...

android系統原始碼結構大致分析

android原始碼專案結構分析 1.android原始碼的是乙個類似於應用軟體的專案,那麼android原始碼這個專案就必定需要模組化,這一點需要清楚。那麼我們就來看看原始碼的目錄模組 ls bionic cts device hardware libcore out sdk bootable d...