欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

详解Android 7.0 Settings 加载选项

程序员文章站 2023-12-18 12:10:04
先写在前面,这说的settings加载选项是指settings这个应用显示在主界面的选项,这个修改需要对系统源码进行修改。 android 7.0 settings顶部多...

先写在前面,这说的settings加载选项是指settings这个应用显示在主界面的选项,这个修改需要对系统源码进行修改。

android 7.0 settings顶部多了一个建议选项,多了个侧边栏,操作更加便捷了。

详解Android 7.0 Settings 加载选项      详解Android 7.0 Settings 加载选项

                  原生7.0主界面                                                          原生7.0侧边栏

android 6.0

之前做android 6.0开发的,都会了解到6.0的settings加载选项是通过加载dashboard_categories.xml,获取需要显示的选项,并且在settingsactivity中也进行判断是否要显示,所以在6.0上添加一个选项是比较简单的,直接在dashboard_categories.xml添加icon、title、summary,也可以添加目标fragment和intent,这样就可以顺利跳转到对应的界面了。但是在7.0上,google对settings进行了重构。

android 7.0

7.0的settings的选项不再从dashboard_categories.xml中加载选项列表,而是通过在androidmanifest.xml中,配置intent-filter的action,在通过packagemanager进行指定的action进行搜索,那么就可以获取到需要显示的选项列表了,并且也需要在代码中进行判断,判断哪些功能需要显示与否。

tileutils.java中通过几个action进行获取系统中对应的activity,如settings中的几个

private static final string settings_action ="com.android.settings.action.settings";

private static final string operator_settings ="com.android.settings.operator_application_setting";

private static final string operator_default_category ="com.android.settings.category.wireless";

private static final string manufacturer_settings ="com.android.settings.manufacturer_application_setting";

private static final string manufacturer_default_category ="com.android.settings.category.device";

通过packagemanager进行搜索,获取到这一系列的activity信息,

packagemanager pm = context.getpackagemanager();
list<resolveinfo> results = pm.queryintentactivitiesasuser(intent,packagemanager.get_meta_data, user.getidentifier());

并且在androidmanifest.xml通过meta-data配置了icon、title、summary,那这就有settings中显示的图标、标题和说明。还有在settings中显示的分类、目标fragment。

settings 的androidmanifest.xml 下面那代码是settings->about phone的activity配置。

<activity android:name="settings$deviceinfosettingsactivity"
        android:theme="@style/theme.subsettingsdialogwhenlarge"
        android:label="@string/device_info_settings"
        android:icon="@drawable/ic_settings_about"
        android:taskaffinity="com.android.settings"
        android:parentactivityname="settings">

      <intent-filter android:priority="1">
        <action android:name="android.settings.device_info_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" />
      </intent-filter>
      <intent-filter android:priority="-1">
        <action android:name="com.android.settings.action.settings" />
      </intent-filter>

      <meta-data android:name="com.android.settings.category"
        android:value="com.android.settings.category.system" />
      <meta-data android:name="com.android.settings.title"
        android:resource="@string/about_settings" />
      <meta-data android:name="com.android.settings.fragment_class"
        android:value="com.android.settings.deviceinfosettings" />

      <meta-data android:name="com.android.settings.primary_profile_controlled"
        android:value="true" />
    </activity>

settings显示各选项的思路比较简单,所以直接在settings里面添加功能选项还是比较简单的。

添加第三方apk到settings选项中

如果需要settings中添加打包好的apk,需要三个步骤。

1. 添加action。

可以被packagemanager搜索到的activity,搜索到后添加到settings的选项列表中

复制代码 代码如下:

private static final string extra_settings_action ="com.android.settings.action.extra_settings";

1、添加显示的选项信息。

在该apk的androidmanifest.xml对应的启动activity中添加以下meta-data。最好是有该apk提供公司的技术支持,不然有混淆的代码就比较难进行更改、回编译了。

  /**
   * the key used to get the category from metadata of activities of action
   * {@link #extra_settings_action}
   * the value must be one of:
   * <li>com.android.settings.category.wireless</li>
   * <li>com.android.settings.category.device</li>
   * <li>com.android.settings.category.personal</li>
   * <li>com.android.settings.category.system</li>
   */
  private static final string extra_category_key = "com.android.settings.category";

  /**
   * name of the meta-data item that should be set in the androidmanifest.xml
   * to specify the icon that should be displayed for the preference.
   */
  public static final string meta_data_preference_icon = "com.android.settings.icon";

  /**
   * name of the meta-data item that should be set in the androidmanifest.xml
   * to specify the title that should be displayed for the preference.
   */
  public static final string meta_data_preference_title = "com.android.settings.title";

  /**
   * name of the meta-data item that should be set in the androidmanifest.xml
   * to specify the summary text that should be displayed for the preference.
   */
  public static final string meta_data_preference_summary = "com.android.settings.summary";

在tileutils.java的白名单中添加对应的包名。

这个也是android考虑到的一些安全上的问题,没有添加到白名单上面的包名,就不会显示出来。

  /// extra package white list for add item to settings @{
  private static final string[] extra_package_white_list = {};
  /// @}

最后就是全编,刷机验证了。

相比android6.0,在7.0上添加功能选项显得更简单了,只需要写好了功能,在settings的androidmanifest.xml中添加必要的参数,或者是在独立的apk中androidmanifest.xml中配置必要的参数,再在tileutils.java中添加包名就好了。需要修改的地方更少了,并且google将很方方法放到了com.android.settinglibs里,精简了一部分代码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: