首页 > 其他分享 >Settings 启动流程

Settings 启动流程

时间:2022-09-05 19:55:45浏览次数:82  
标签:启动 流程 settings final item TAG android void Settings

Settings 启动流程

  1. Settings-->Manifest.xml-->action.MAIN-->SettingsHomepageActivity

    public class SettingsHomepageActivity extends FragmentActivity {
     @Override
       protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
      //Settings首页布局
           setContentView(R.layout.settings_homepage_container);
           //一级菜单主要内容,跳转至TopLevelSettings显示
           showFragment(new TopLevelSettings(), R.id.main_content);
      }
    }
    public class TopLevelSettings extends DashboardFragment {
           //根据Fragment生命周期运行
            @Override
       public void onAttach(Context context) {
           super.onAttach(context);
           //获取item controler并设置对应的Activity,locate in DashboardFragment.java
    use(SupportPreferenceController.class).setActivity(getActivity());
          ...
           //fragment剩余生命周期在执行父类DashboardFragment中的生命周期
      }
       
           @Override
       protected String getLogTag() {
           return TAG;//TAG = "TopLevelSettings"
      }
       //获取main_item 布局id
           @Override
       protected int getPreferenceScreenResId() {
           return R.xml.top_level_settings;
      }
           
    }
    public abstract class DashboardFragment extends SettingsPreferenceFragment {
    ...
    @Override
       public void onCreate(Bundle icicle) {
           super.onCreate(icicle);
           // Set ComparisonCallback so we get better animation when list changes.
           getPreferenceManager().setPreferenceComparisonCallback(
                   new PreferenceManager.SimplePreferenceComparisonCallback());
         
           if (icicle != null) {
               // Upon rotation configuration change we need to update preference states before any
               // editing dialog is recreated (that would happen before onResume is called).
               //首次不调用,初始化Controller。第二次调用,更新Preference
               updatePreferenceStates();
          }
      }
       //Log显示调用方法创建Preference列表
           @Override
       public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
           refreshAllPreferences(getLogTag());
      }
       
       //TopLevelSettings.java重写该方法
       protected abstract String getLogTag();
       
       private void refreshAllPreferences(final String TAG) {
           final PreferenceScreen screen = getPreferenceScreen();
           // First remove old preferences.
           if (screen != null) {
               // Intentionally do not cache PreferenceScreen because it will be recreated later.
               screen.removeAll();
          }

           // Add resource based tiles.
           displayResourceTiles();//静态方式加载Settings一级菜单main item

           refreshDashboardTiles(TAG);//动态刷新main_content 状态

           final Activity activity = getActivity();
           if (activity != null) {
               Log.d(TAG, "All preferences added, reporting fully drawn");
               activity.reportFullyDrawn();
          }

           updatePreferenceVisibility(mPreferenceControllers);
      }
       
           private void displayResourceTiles() {
          final int resId = getPreferenceScreenResId();//TopLevelSettings.java重写该方法获取main_content对应布局id
          if (resId <= 0) {
               return;
          }
          addPreferencesFromResource(resId);
      }
     
           void refreshDashboardTiles(final String TAG) {
          final PreferenceScreen screen = getPreferenceScreen();

        final DashboardCategory category =
                   mDashboardFeatureProvider.getTilesForCategory(getCategoryKey());
          if (category == null) {
               Log.d(TAG, "NO dashboard tiles for " + TAG);
               return;
          }
          ....
          }
       
       
           protected <T extends AbstractPreferenceController> T use(Class<T> clazz) {
          List<AbstractPreferenceController> controllerList = mPreferenceControllers.get(clazz);
          if (controllerList != null) {
               if (controllerList.size() > 1) {
                   Log.w(TAG, "Multiple controllers of Class " + clazz.getSimpleName()
                           + " found, returning first one.");
              }
              return (T) controllerList.get(0);
          }

          return null;
      }
    }
     
    //top_level_settings.xml

    <PreferenceScreen
       xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:settings="http://schemas.android.com/apk/res-auto"
       android:key="top_level_settings">
           <Preference
           android:key="top_level_network"
           android:title="@string/network_dashboard_title"
           android:summary="@string/summary_placeholder"
           android:icon="@drawable/ic_homepage_network"
           android:order="-120"
           android:fragment="com.android.settings.network.NetworkDashboardFragment"
           settings:controller="com.android.settings.network.TopLevelNetworkEntryPreferenceController"/>
          ...
           <Preference
           android:key="top_level_security" //每个item必须有key属性
           android:title="@string/security_settings_title"
           android:summary="@string/summary_placeholder"
           android:icon="@drawable/ic_homepage_security"
           android:order="-40" //负值:绝对值越大越靠前;正值,绝对值越大越靠后
           android:fragment="com.android.settings.security.SecuritySettings" //点击item对应跳转的fragment
           settings:controller="com.android.settings.security.TopLevelSecurityEntryPreferenceController"/> //当前item的controller;每个item都必须要有该属性,也可直接在相关fragment中实现createPreferenceControllers()方法去调用构造相关controller.
         
          ....
       
       
    </PreferenceScreen>    
  2.  

标签:启动,流程,settings,final,item,TAG,android,void,Settings
From: https://www.cnblogs.com/a-n-yan/p/16659361.html

相关文章

  • SystemUI启动流程
    SystemUI启动流程frameworks\base\services\java\com\android\server\SystemServer.javapublicfinalclassSystemServer{  privatestaticfinalTimingsTrac......
  • 流程控制
    流程控制​流程控制主要有三种结构,分别是顺序结构、分支结构、循环结构,这三种结构代表三种代码执行的顺序顺序流程控制​顺序结构是程序中最简单、最......
  • zabbix监控配置流程
    zabbix监控配置流程管理层次:开发人员要加监控,需要让其提供监控指标运营人员要加监控,让其找开发要监控指标运维人员要加监控,让运营人员去找开发要监控指标。配置层次:......
  • vuex使用流程
     从状态出发,将状态提供给vue组件,组件在actions的方法中请求后端接口得到数据,然后委托给mutations(或者通过开发者工具进行更改),来改变状态。 ......
  • Handler的基本使用和工作流程
    一、Handler的基本使用Handler一套Android消息传递机制,在多线程的应用场景中,将工作线程中需更新UI的操作信息传递到UI主线程,从而实现工作线程对UI的更新处理,最终实现异......
  • MBR硬盘丢失UEFI启动项的问题
    MBR硬盘丢失UEFI启动项的问题现象描述:联想笔记本电脑,MBR硬盘有一个FAT32分区,UEFI启动的时候,UEFI的引导项bootx64.efi,bootmgfw.efi总是时不时地丢失。解决办法:用傲梅分区助......
  • Unreal引擎启动流程及耗时分析
    引擎版本:4.18部分耗时流程结构概述:Winmain └GuardedMain └EnginePreInit └FEngineLoop::PreInit └LoadPreInitModules() └AppInit() └Proces......
  • pm2 开机自启动项目
    1、首先在项目根目录使用pm2启动项目```jspm2start./dist/main.js```2、生成开机启动pm2服务的配置文件运行:pm2startup命令,会生成以下命令```jsTosetu......
  • ENVI自动配准流程化工具的另类用法
    这里说的另类用法是指:只想利用自己手动添加的同名点用于图像配准,而不希望工具自动找点。这种需求一般用于无法自动找点的情况,比如卫星图像与DRG之类的线划图进行配准时。......
  • MySQL安装流程
    一、下载MySQL  Mysql官网下载地址:https://downloads.mysql.com/archives/installer/  1.选择想要安装的版本,点击Download下载  本篇文章选择的是......