Android Settings 跳转流程

简介: 学习笔记

26463879-0abc7972f3a8e23c.png

点击事件回调堆栈.png

我们知道在Settings中,各模块的Fragment基本都继承了DashboardFragment,当有点击事件时,就会回调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()方法中可以根据preference的key做事件拦截,如果不会拦截,将会调用到父类InstrumentedPreferenceFragment的onPreferenceTreeClick()方法:

@Override
    public boolean onPreferenceTreeClick(Preference preference) {
        writePreferenceClickMetric(preference);
        return super.onPreferenceTreeClick(preference);
    }

在该方法中,又将会调用到androidx中的PreferenceFragmentCompat方法中,由于androidx中源码不开放,就不做分析,但下一步回将调到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()方法,启动了对应的空Activity,但在Setting中各模块的Activity都时继承SettingsActivity的。但对应的空Activity启动时,就会回执行SettingsActivity中onCreate()方法:

@Override  
    protected void onCreate(Bundle savedState) {  
        super.onCreate(savedState);  
        long startTime = System.currentTimeMillis();  
        //工厂类实现方法com.android.settings.overlay.FeatureFactoryImpl.java  
        final FeatureFactory factory = FeatureFactory.getFactory(this);  
        //获取菜单信息的工厂类,实现类为DashboardFeatureProviderImpl.java  
        mDashboardFeatureProvider = factory.getDashboardFeatureProvider(this);  
        mMetricsFeatureProvider = factory.getMetricsFeatureProvider();  
 // 第一步    从intent信息中获取<meta-data/>标签名为"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);  
        //是否为快捷进入方式(如从其它的应用进入Settings的某个设置项)  
        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) 方法中加载相对应的Fragment布局,(若注释这句话:你会发现 Activity 启动了,却没有布局)。



相关文章
|
15天前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
66 6
|
13天前
|
程序员 开发工具 Android开发
Android|WebView 禁止长按,限制非白名单域名的跳转层级
如何限制 WebView 仅域名白名单网址能随意跳转,并禁用长按选择文字。
25 2
|
14天前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
16天前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
22 3
|
17天前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
19 2
|
30天前
|
XML 前端开发 Android开发
Android View的绘制流程和原理详细解说
Android View的绘制流程和原理详细解说
33 3
|
16天前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
13 0
|
2月前
|
Android开发 开发者
Android面试之Activity启动流程简述
每个Android开发者都熟悉的Activity,但你是否了解它的启动流程呢?本文将带你深入了解。启动流程涉及四个关键角色:Launcher进程、SystemServer的AMS、应用程序的ActivityThread及Zygote进程。核心在于AMS与ActivityThread间的通信。文章详细解析了从Launcher启动Activity的过程,包括通过AIDL获取AMS、Zygote进程启动以及ActivityThread与AMS的通信机制。接着介绍了如何创建Application及Activity的具体步骤。整体流程清晰明了,帮助你更深入理解Activity的工作原理。
46 0
|
7天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。
|
5天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
18 5