Android?Settings?跳轉(zhuǎn)流程方法詳解
點(diǎn)擊事件回調(diào)堆棧
onPreferenceTreeClick()方法
我們知道在Settings中,各模塊的Fragment基本都繼承了DashboardFragment,當(dāng)有點(diǎn)擊事件時(shí),就會(huì)回調(diào)DashboardFragment中的onPreferenceTreeClick()方法:
@Override public boolean onPreferenceTreeClick(Preference preference) { final Collection<List<AbstractPreferenceController>> controllers = mPreferenceControllers.values(); for (List<AbstractPreferenceController> controllerList : controllers) { for (AbstractPreferenceController controller : controllerList) { if (controller.handlePreferenceTreeClick(preference)) { // log here since calling super.onPreferenceTreeClick will be skipped writePreferenceClickMetric(preference); return true; } } } return super.onPreferenceTreeClick(preference); }
在onPreferenceTreeClick()方法中可以根據(jù)preference的key做事件攔截,如果不會(huì)攔截,將會(huì)調(diào)用到父類InstrumentedPreferenceFragment的onPreferenceTreeClick()方法:
@Override public boolean onPreferenceTreeClick(Preference preference) { writePreferenceClickMetric(preference); return super.onPreferenceTreeClick(preference); }
在該方法中,又將會(huì)調(diào)用到androidx中的PreferenceFragmentCompat方法中,由于androidx中源碼不開(kāi)放,就不做分析,但下一步回將調(diào)到SettingsActivity中的onPreferenceStartFragment()方法:
@Override public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) { new SubSettingLauncher(this) .setDestination(pref.getFragment()) .setArguments(pref.getExtras()) .setSourceMetricsCategory(caller instanceof Instrumentable ? ((Instrumentable) caller).getMetricsCategory() : Instrumentable.METRICS_CATEGORY_UNKNOWN) .setTitleRes(-1) .launch(); return true; }
在該方法中由SubSettingLauncher類里面的launch()方法,啟動(dòng)了對(duì)應(yīng)的空Activity,但在Setting中各模塊的Activity都時(shí)繼承SettingsActivity的。
執(zhí)行SettingsActivity中onCreate()方法
但對(duì)應(yīng)的空Activity啟動(dòng)時(shí),就會(huì)回執(zhí)行SettingsActivity中onCreate()方法:
@Override protected void onCreate(Bundle savedState) { super.onCreate(savedState); long startTime = System.currentTimeMillis(); //工廠類實(shí)現(xiàn)方法com.android.settings.overlay.FeatureFactoryImpl.java final FeatureFactory factory = FeatureFactory.getFactory(this); //獲取菜單信息的工廠類,實(shí)現(xiàn)類為DashboardFeatureProviderImpl.java mDashboardFeatureProvider = factory.getDashboardFeatureProvider(this); mMetricsFeatureProvider = factory.getMetricsFeatureProvider(); // 第一步 從intent信息中獲取<meta-data/>標(biāo)簽名為"com.android.settings.FRAGMENT_CLASS"的值(下文用于加載Fragment的類名) getMetaData(); // 第二步 final Intent intent = getIntent(); if (intent.hasExtra(EXTRA_UI_OPTIONS)) { getWindow().setUiOptions(intent.getIntExtra(EXTRA_UI_OPTIONS, 0)); } //獲取上面getMetaData()得到的類名 final String initialFragmentName = intent.getStringExtra(EXTRA_SHOW_FRAGMENT); //是否為快捷進(jìn)入方式(如從其它的應(yīng)用進(jìn)入Settings的某個(gè)設(shè)置項(xiàng)) mIsShortcut = isShortCutIntent(intent) || isLikeShortCutIntent(intent) || intent.getBooleanExtra(EXTRA_SHOW_FRAGMENT_AS_SHORTCUT, false); ... ... if (savedState != null) { ... ... } else { // 第三步 加載布局 launchSettingFragment(initialFragmentName, isSubSettings, intent); } ... ... }
最終在 launchSettingFragment(initialFragmentName, isSubSettings, intent) 方法中加載相對(duì)應(yīng)的Fragment布局,(若注釋這句話:你會(huì)發(fā)現(xiàn) Activity 啟動(dòng)了,卻沒(méi)有布局)。
以上就是Android Settings 跳轉(zhuǎn)流程方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Android Settings跳轉(zhuǎn)流程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android如何實(shí)現(xiàn)藍(lán)牙配對(duì)連接功能
Android 并沒(méi)有開(kāi)放配對(duì)連接耳機(jī)的接口,而且網(wǎng)上大部分資料都是講解如何連接藍(lán)牙4.0的,很少有資料詳細(xì)介紹藍(lán)牙2.0相關(guān)的。期間還是踩了不少坑才摸索出解決辦法。所以把我自己摸索總結(jié)出來(lái)的經(jīng)驗(yàn)梳理記錄下,以便備份2021-05-05Android 自定義Button控件實(shí)現(xiàn)按鈕點(diǎn)擊變色
這篇文章給大家介紹了android 自定義Button控件實(shí)現(xiàn)按鈕點(diǎn)擊變色的代碼,本文給大家附有注釋,非常不錯(cuò),代碼簡(jiǎn)單易懂,對(duì)android按鈕點(diǎn)擊變色的實(shí)現(xiàn)感興趣的朋友參考下吧2016-11-11Dialog底部彈出自定義view并且伴隨動(dòng)畫彈出和消失
這篇文章主要介紹了Dialog底部彈出自定義view并且伴隨動(dòng)畫彈出和消失的相關(guān)資料,需要的朋友可以參考下2016-12-12Android不使用自定義布局情況下實(shí)現(xiàn)自定義通知欄圖標(biāo)的方法
這篇文章主要介紹了Android不使用自定義布局情況下實(shí)現(xiàn)自定義通知欄圖標(biāo)的方法,實(shí)例分析了Android通知欄圖標(biāo)的創(chuàng)建技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12Android界面 NotificationManager使用Bitmap做圖標(biāo)
Android界面 NotificationManager使用Bitmap做圖標(biāo),如何實(shí)現(xiàn)呢,本文將介紹解決方法,需要的朋友可以參考下2012-12-12Kotlin Service服務(wù)組件開(kāi)發(fā)詳解
這幾天分析了一下的啟動(dòng)過(guò)程,于是乎,今天寫一下Service使用; 給我的感覺(jué)是它并不復(fù)雜,千萬(wàn)不要被一坨一坨的代碼嚇住了,雖然彎彎繞繞不少,重載函數(shù)一個(gè)接著一個(gè),就向走迷宮一樣,但只要抓住主線閱讀,很快就能找到出口2022-12-12