Android N Setttings 零-壹 读源码------first part

首先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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值