日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Lollipop (5.0) 原生代码 Settings 首页加载逻辑分析

發布時間:2025/3/15 Android 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Lollipop (5.0) 原生代码 Settings 首页加载逻辑分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
主入口為com.android.settings.Settings. 這只是一個wrapper的類, 它繼承于 SettingsActivity類,并且聲明了一堆公有的繼承于SettingsActivity的類作為內部類。 例如: public static class BluetoothSettingsActivity extends SettingsActivity { /* empty */ }
public static class WirelessSettingsActivity extends SettingsActivity { /* empty */ }
public static class SimSettingsActivity extends SettingsActivity { /* empty */ }
所以,來看SettingsActivity。 這個類里面有很多的方法, 我們一開始并不知道哪些是在初始化時有用的。所以先全部打上斷點。 然后點擊Launcher里面的Settings開始斷點調試。 命中的函數斷點并不算太多,我們會注意到這個函數: buildDashboardCategories, 在這個函數被調用以后,界面差不多就加載好了。 事實上,這個函數會調用?loadCategoriesFromResource這個函數。而這個函數里面看起來像是在加載XML資源。 現在, 終點大概找到了。 下面再來理清楚它是怎么逐步調用的。 來看命中buildDashboardCategories時候的堆棧。 可以看到, 起源在于DashboardSummary里面的rebuildUI的函數。 而這個函數是由一個handler調用起來的。 查找這個handler如下:
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_REBUILD_UI: {
final Context context = getActivity();
rebuildUI(context);
} break;
}
}
};

這個私有的handler,在當前文件可以找到調用方: sendRebuildUI(),在這里打斷點,察看堆棧,會發現它是由DashboardSummary的onResume()方法調用的。 再來看這個類的
定義: DashboardSummary extends Fragment。 是一個Fragment。 所以它是在這個Fragment加載時候觸發的。 Fragment的加載,要么是在XML文件里面定義好了,要么是用
代碼在運行時加載的。 所以應該去察看SetttingsActivity的UI加載部分,也就是要找setContentView函數。 我們找到了這段代碼:
setContentView(mIsShowingDashboard ?
??????????????? R.layout.settings_main_dashboard : R.layout.settings_main_prefs);
經過斷點調試,可以看到這里調用的是R.layout.settings_main_dashboard。 來看它的布局:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_content"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="@color/dashboard_background_color"
/>

很簡單,只有一個frameLayout, id為main_content, 并不是我們期望的Fragment。 在onCreate里面繼續往下找, 或者搜索DashboardSummary(因為在布局里面沒有看到
DashboardSummary, 所以必然Activity用代碼的方式調用了DashboardSummary), 很容易找到了switchToFragment函數:
調用:
switchToFragment(DashboardSummary.class.getName(), null, false, false,
??????????????????????? mInitialTitleResId, mInitialTitle, false);
這個函數代碼不多, 看起來容易, 里面有幾句:
Fragment f = Fragment.instantiate(this, fragmentName, args);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.main_content, f);

看到這里就差不多連起來了。 在SettingsActivity里面的onCreate方法里面, 通過調用這個函數, 把名為main_content的對象替換成了DashboardSummary的實例。 繼而激活
了這個fragment的onResume-> rebuildUI() -> SettingsActivity里面的buildDashboardCategories() -> 解析XML文件dashboard_categories.xml, 從而獲得
Settings主頁該顯示哪些內容。

如果有興趣的可以再仔細看一下這個xml和loadCategoriesFromResource函數,看加載了哪些內容。 我想這里可以分享的經驗主要是如何面對一段未知的代碼來理清楚它的
邏輯走向。 調用堆棧和Call hierarchy都是很好的輔助工具(Call Hierarchy在Android Studio里面的 Navigate-> Call Hierarchy)

歡迎轉載,轉載請注明出處。如果覺得有一丁點的幫助請點擊一下推薦。多謝。


原文地址:http://www.cnblogs.com/zzpbuaa/p/5301965.html

總結

以上是生活随笔為你收集整理的Android Lollipop (5.0) 原生代码 Settings 首页加载逻辑分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。