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