android8.0 Settings笔记

1、第一步,选择UI布局

当启动settings应用时,根据idh.code/packages/apps/Settings下的AndroidManifest.xml会启动Settings这个activity
        <activity android:name="Settings"
                android:taskAffinity="com.android.settings"
                android:label="@string/settings_label_launcher"
                android:launchMode="singleTask">
            <intent-filter android:priority="1">
                <action android:name="android.settings.SETTINGS" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                android:value="true" />
        </activity>

又因为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
<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/material_grey_300"
         />

    settings_main_dashboard.xml用于展示settings的设置有哪几类category,每个category下有多少个tile,
    相应的数据来源是idh.code/packages/apps/Settings下的AndroidManifest.xml,注册的activity的时所用的Mata-data标签,例如
    
        <activity android:name="Settings$DataPlanUsageSummaryActivity"
                android:label="@string/data_usage_summary_title"
                android:icon="@drawable/ic_settings_data_usage"
                android:taskAffinity="">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="com.android.settings.SHORTCUT" />
            </intent-filter>
            <intent-filter android:priority="10">
                <action android:name="com.android.settings.action.SETTINGS" />
            </intent-filter>
            <meta-data android:name="com.android.settings.category"#####看些处
                    android:value="com.android.settings.category.ia.wireless" />
                    
            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"###当点击“流量使用情况”这个tile时,就会启动以下DataPlanUsageSummary这个fragment.
                    android:value="com.android.settings.datausage.DataPlanUsageSummary" />
        </activity>
        
        很显然,packagemanger安装settings时,会把AndroidManifest.xml的相应meta-data解析出来。只要使用的时候,
        读取这个数据就可以了,这个在SettingsDrawerActivity.onResume()。         
         
         
###############################################################################################################
这是mIsShowingDashboard是false的情况,布局如下;
/Settings/res/layout/settings_main_prefs.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_height="match_parent"
              android:layout_width="match_parent">

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

        <com.android.settings.widget.SwitchBar android:id="@+id/switch_bar"
                  android:layout_height="?android:attr/actionBarSize"
                  android:layout_width="match_parent"
                  android:background="@drawable/switchbar_background"
                  android:theme="?attr/switchBarTheme"
                />

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

    </LinearLayout>
......

</LinearLayout>

2、第二部,加载UI数据

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

        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数据的数据就有了,就不展开了
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值