1.Android5.0和前版本的Setting实现方式有区别,需要看较早版本的请戳http://blog.csdn.net/wangjinyu501/article/details/22077803
2.本文主要是对Setting的启动进行大致分析
1.总概况
本文只分析启动过程
2.Settings初始化流程
首先根据manifest文件找出最先启动的activity:Settings。该类具体代码如下:
public class Settings extends SettingsActivity {
/*
* Settings subclasses for launching independently.
*/
public static class BluetoothSettingsActivity extends SettingsActivity { /* empty */ }
public static class WirelessSettingsActivity extends SettingsActivity { /* empty */ }
public static class SimSettingsActivity extends SettingsActivity { /* empty */ }
public static class AppOpsSummaryActivity extends SettingsActivity {
@Override
public boolean isValidFragment(String className) {
if (AppOpsSummary.class.getName().equals(className)) {
return true;
}
return super.isValidFragment(className);
}
}
public static class StorageUseActivity extends SettingsActivity { /* empty */ }
public static class OtherSoundSettingsActivity extends SettingsActivity { /* empty */ }
public static class QuickLaunchSettingsActivity extends SettingsActivity { /* empty */ }
public static class TopLevelSettings extends SettingsActivity { /* empty */ }
public static class ApnSettingsActivity extends SettingsActivity { /* empty */ }
}
可以看出Setting类主要是继承了SettingsActivity,然后创建了很多的内部类。直接转到SettingsActivity。既然是Activity直奔onCreate方法。
getMetaData();//此函数在初始化时会直接返回
mIsShowingDashboard = className.equals(Settings.class.getName());//此时className和Settings.class一致,为true;
setContentView(mIsShowingDashboard ? R.layout.settings_main_dashboard : R.layout.settings_main_prefs);
终于加载xml文件了,可知本次加载的是
R.layout.settings_main_dashboard,该xml文件代码如下:
<?xml version="1.0" encoding="utf-8"?>
<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/dashboard_background_color"
/>
除了一个FrameLayout什么都没有,猜测setting的很多设置项就是放在了这个id为main_content的FrameLayout中显示的。继续onCreate方法
<span style="white-space:pre"> </span>mDisplayHomeAsUpEnabled = false;
mDisplaySearch = true;
mInitialTitleResId = R.string.dashboard_title;// <string name="dashboard_title">Settings</string>
switchToFragment(DashboardSummary.class.getName(), null, false, false,mInitialTitleResId, mInitialTitle, false);
重点在
switchToFragment这个函数,猜测是将一个Fragment放在前文提到的id为main_content的FrameLayout中。
private Fragment switchToFragment(String fragmentName, B