1. Settings的AndroidManifest.xml
Settings也是一个apk,有自己的layout和activity。该layout文件决定了Settings的菜单分级显示,位于/packages/apps/Settings/AndroidManifest.xml,上部分源代码
... ...
<activity
android:name="Settings$VpnSettingsActivity"
android:label="@string/vpn_settings_title"
android:icon="@drawable/ic_settings_wireless"
android:taskAffinity="com.android.settings"
android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.VPN_SETTINGS" />
<action android:name="android.net.vpn.SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.VOICE_LAUNCH" />
<category android:name="com.android.settings.SHORTCUT" />
</intent-filter>
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.vpn2.VpnSettings" />
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
android:value="true" />
</activity>
... ...
例如,我们需要在Settings里面加一个item项为Mimo。就有两种选择,设置为Activity、设置为Fragment。Fragment作为更简洁灵活的UI被广泛应用于大屏Android Pad中。接下来介绍分别如何以普通Activity身份加入item,如何以Fragment class身份加入item。
2. Activity作为item加入设置
<activity android:name="MiMo"
android:label="@string/app_name"
android:icon="@mipmap/ic_mimo" //需要自行把ic_mimo.png加入/res/mipmap/
>
<intent-filter android:priority="1">
<action android:name="com.android.settings.MIMO" />
<action android:name="android.settings.MIMO" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.VOICE_LAUNCH" />
<category android:name="com.android.settings.SHORTCUT" />
</intent-filter>
<intent-filter android:priority="9">
<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.homepage" />
<meta-data android:name="com.android.settings.ACTIVITY_ACTION" //表明是Activity插入
android:value="com.android.settings.MiMo" />
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
android:value="true" />
</activity>
接下来,需要定义MiMo这个Activity,把MiMo.java放在/packages/apps/Settings/src目录下。例如
package com.android.settings
public class MiMo extends AppCompatActivity{ ... }
3.添加Fragment至设置
我把MiMo作为Fragment插入设置菜单中
<activity
android:name="Settings$MiMoActivity" //属于Settings目录下的MiMoActivity
android:label="@string/mimo_settings_title" //在/packages/apps/Settings/res/values/string.xml
android:icon="@mipmap/ic_mimo" //在/res/mipmap目录下添加ic_mimo.png
android:taskAffinity="com.android.settings"
android:parentActivityName="Settings">
<intent-filter android:priority="1"> //决定了显示的优先级,优先级相同的Settings以首字母排序
<action android:name="android.settings.MIMO" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.VOICE_LAUNCH" />
<category android:name="com.android.settings.SHORTCUT" />
</intent-filter>
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.MiMo" />
<meta-data android:name="com.android.settings.category"
android:value="com.android.settings.category.ia.homepage" /> //决定了显示菜单级别
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
android:value="true" />
</activity>
在Settings.java (packages/apps/Settings/src)中,添加MiMoActivity定义
public static class MiMoActivity extends SettingsActivity { }
在SettingsGateway.java (packages/apps/Settings/src/com/android/settings/core/gateway),添加
public static final String[] ENTRY_FRAGMENTS = {
MiMo.class.getName(),
... ...
}
public static final String[] SETTINGS_FOR_RESTRICTED = {
Settings.MiMoActivity.class.getName(),
... ...
}
然后需要你自己实现MiMo啦,步骤与2的最后一步相同。
最最重要的事情!你需要重新make源代码(目前都是用Android.bp来代替makefile,其实本质差不多)。make完以后你也不用重新烧写所有的img文件,然后获取root权限。你只需要替换system/priv-app/Settings/Settings.apk这个即可,然后reboot就可以预览你添加新item的Settings菜单了。
如有任何问题和疑问,欢迎大家关注我的微信公众号: