首先Settings 的路径: packages/apps/Settings 从AndroidMainfest.xml 中
<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的入口是Settings 而非SettingsActivity
taskAffinity属性 具体解释 见如下链接:
http://blog.csdn.net/zhangjg_blog/article/details/10923643
<activity-alias android:name="Settings"
android:taskAffinity="com.android.settings"
android:label="@string/settings_label_launcher"
android:launchMode="singleTask"
android:targetActivity="Settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts"/>
</activity-alias>
activity-alias 属于 activity 的一个子集,实现程序多入口配置, 详见:
http://www.androidchina.net/2970.html
Settings.java源码:
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 Lte4GEnableActivity extends SettingsActivity { /* empty */ }
.....
}
Settings 继承了 SettingsActivity ,并创建了很多的 未实现方法 内部静态类,所有的类 的父类都是SettingsActivity, 可见所有的方法实现都在其中
SettingsActivity 从onCreate()方法中调用getMetaData() 如下:
/**
* 获取activity 额外的数据 mFragmentClass ,如果可以获取这个数据 ,则可以显示
* mFragmentClass 对应的activity
*
*
* ActivityInfo: 获得应用程序中<activity/>或者 <receiver />节点的信息
*
* <meta-data>元素可以作为子元素,被包含在<activity>、<application> 、<service>和<receiver>元素中
*
*/
private void getMetaData() {
try {
//
ActivityInfo ai = getPackageManager().getActivityInfo(getComponentName(),
PackageManager.GET_META_DATA);
if (ai == null || ai.metaData == null) return;
mFragmentClass = ai.metaData.getString(META_DATA_KEY_FRAGMENT_CLASS);
mActivityAction = ai.metaData.getString(META_DATA_KEY_LAUNCH_ACTIVITY_ACTION);
} catch (NameNotFoundException nnfe) {
// No recovery
Log.d(LOG_TAG, "Cannot get Metadata for: " + getComponentName().toString());
}
}
附 Settings 源码地址:
https://github.com/chenxinsi/Settings