android8.0 Settings笔记

1、第一步,选择UI布局

当启动settings应用时,根据idh.code/packages/apps/Settings下的AndroidManifest.xml会启动Settings这个activity
                        android:taskAffinity="com.android.settings"
                android:label="@string/settings_label_launcher"
                android:launchMode="singleTask">
           
               
               
           

                            android:value="true" />
       

又因为Settings extends SettingsActivity,而SettingsActivity extends SettingsDrawerActivity

所以会先执行SettingsDrawerActivity.onCreate()
    这部分代码在 idh.code/frameworks/base/packages/SettingsLib/drawer/SettingsDrawerActivity.java
    这里自己去看下做了些什么。


然后再执行SettingsActivity.onCreate()

通过mIsShowingDashboard来决定加载哪个布局。
因为是启动Settings这个activity,根据这句代码mIsShowingDashboard = className.equals(Settings.class.getName());
 mIsShowingDashboard是true;

    setContentView(mIsShowingDashboard ? R.layout.settings_main_dashboard : R.layout.settings_main_prefs);
    mContent = (ViewGroup) findViewById(R.id.main_content);

    两个布局都有相同的资源id.    
    res/layout/settings_main_dashboard.xml:21:             android:id="@+id/main_content"
    res/layout/settings_main_prefs.xml:39:                android:id="@+id/main_content"
    
这是mIsShowingDashboard是true的情况,布局如下;
/Settings/res/layout/settings_main_dashboard.xml
         android:id="@+id/main_content"
         android:layout_height="match_parent"
         android:layout_width="match_parent"
         android:background="@color/material_grey_300"
         />

    settings_main_dashboard.xml用于展示settings的设置有哪几类category,每个category下有多少个tile,
    相应的数据来源是idh.code/packages/apps/Settings下的AndroidManifest.xml,注册的activity的时所用的Mata-data标签,例如
    
                         android:label="@string/data_usage_summary_title"
                android:icon="@drawable/ic_settings_data_usage"
                android:taskAffinity="">
           
               
               
               
           

           
               
           

                                android:value="com.android.settings.category.ia.wireless" />
                    
                                android:value="com.android.settings.datausage.DataPlanUsageSummary" />
       

        
        很显然,packagemanger安装settings时,会把AndroidManifest.xml的相应meta-data解析出来。只要使用的时候,
        读取这个数据就可以了,这个在SettingsDrawerActivity.onResume()。         
         
         
###############################################################################################################
这是mIsShowingDashboard是false的情况,布局如下;
/Settings/res/layout/settings_main_prefs.xml
              android:orientation="vertical"
              android:layout_height="match_parent"
              android:layout_width="match_parent">

                android:orientation="vertical"
            android:layout_height="0px"
            android:layout_width="match_parent"
            android:layout_weight="1">

                          android:layout_height="?android:attr/actionBarSize"
                  android:layout_width="match_parent"
                  android:background="@drawable/switchbar_background"
                  android:theme="?attr/switchBarTheme"
                />

                        android:id="@+id/main_content"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                />

   
......

2、第二部,加载UI数据

然后再执行基类SettingsDrawerActivity.onResume();
会执行CategoriesUpdateTask().execute();
    private class CategoriesUpdateTask extends AsyncTask {

        private final CategoryManager mCategoryManager;

        public CategoriesUpdateTask() {
            mCategoryManager = CategoryManager.get(SettingsDrawerActivity.this);
        }

        @Override
        protected Void doInBackground(Void... params) {
            mCategoryManager.reloadAllCategories(SettingsDrawerActivity.this, getSettingPkg());
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            mCategoryManager.updateCategoryFromBlacklist(sTileBlacklist);
            onCategoriesChanged();
        }
    }
通过这一步,Dashboard数据的数据就有了,就不展开了
 

你可能感兴趣的:(android)