详解Android 7.0 Settings 加载选项

先写在前面,这说的Settings加载选项是指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里,精简了一部分代码。

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

(0)

相关推荐

  • Android7.0 工具类:DiffUtil详解

    一 概述 DiffUtil是support-v7:24.2.0中的新工具类,它用来比较两个数据集,寻找出旧数据集->新数据集的最小变化量. 说到数据集,相信大家知道它是和谁相关的了,就是我的最爱,RecyclerView. 就我使用的这几天来看,它最大的用处就是在RecyclerView刷新时,不再无脑mAdapter.notifyDataSetChanged(). 以前无脑mAdapter.notifyDataSetChanged()有两个缺点: 1.不会触发RecyclerView的动画(删

  • Android 7.0中新签名对多渠道打包的影响详解

    老签名多渠道打包原理 前言 由于Android7.0发布了新的签名机制,加强了签名的加固,导致在新的签名机制下无法通过美团式的方式再继续打多渠道包了.不过在说新的签名机制对打包方案的 影响和为什么会影响我们原有的打包机制之前,需要先简单理解下打包原理和签名在整个打包过程中的作用. Android打包流程 Android打包过程大致如图所示,整个流程就是将Java代码,资源文件以及第三方库整合成一个Apk文件,并对整合后的文件进行签名和优化对齐.整个过程可以简 单分为以下几个步骤: 资源预编译 为

  • Android 7.0中拍照和图片裁剪适配的问题详解

    前言 Android 7.0系统发布后,拿到能升级的nexus 6P,就开始了7.0的适配.发现在Android 7.0以上,在相机拍照和图片裁剪上,可能会碰到以下一些错误: Process: com.yuyh.imgsel, PID: 22995 // 错误1 android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.yuyh.imgsel/cache/1486438962645.jpg ex

  • Android7.0 MessageQueue详解

    Android中的消息处理机制大量依赖于Handler.每个Handler都有对应的Looper,用于不断地从对应的MessageQueue中取出消息处理. 一直以来,觉得MessageQueue应该是Java层的抽象,然而事实上MessageQueue的主要部分在Native层中. 自己对MessageQueue在Native层的工作不太熟悉,借此机会分析一下. 一.MessageQueue的创建 当需要使用Looper时,我们会调用Looper的prepare函数: public stati

  • Android 7.0新特性详解

    谷歌正式在I/O大会现场详细介绍了有关Android 7.0的大量信息.目前,我们已经知道,新一代Android操作系统将支持无缝升级,能够通过Vulkan API来在中低硬件配置设备上实现流 畅.游戏体验以及更多的Emoji表情.不过,Android 7.0最大也是最引人关注的还是来自运行效率上的改进. 来自I/O大会现场的PPT显示,Android N的代码减少了50%,新的代码减少50%,安卓N运行环境有了明显改善,软件运行速度提升幅度达到600%,应用安装提速75%.这意味着用户 正在迎

  • Android 7.0调用相机崩溃详解及解决办法

    Android 7.0调用相机崩溃解决办法 错误提示: android.os.FileUriExposedException: file:///storage/emulated/0/DCIM/IMG_1041503431.jpg exposed beyond app through ClipData.Item.getUri() 处理方式 /** * Open camera */ private void showCameraAction() { if (ContextCompat.checkSe

  • Android 7.0 Nougat不得不知的11项新功能

    最近 Google 已经发布 Android 新版本 7.0 Nougat (牛轧糖) ,相信Android手机用户在未来的几个月内会收到第三方手机制造商推送的系统升级,无论你是已经下载升级的幸运者,还是焦急等待更新的用户,Android 7.0 Nougat 都有一些很棒的功能值得尝试,下面是11 项 在 Android 7.0 Nougat 系统中不可错过的功能. 1) 同时运行多个应用 Android 终于正式地支持分屏模式,通过分屏模式可以同时打开两个应用,这个功能在平板上使用起来特别方

  • 详解Android 7.0 Settings 加载选项

    先写在前面,这说的Settings加载选项是指Settings这个应用显示在主界面的选项,这个修改需要对系统源码进行修改. Android 7.0 Settings顶部多了一个建议选项,多了个侧边栏,操作更加便捷了.       原生7.0主界面                                                          原生7.0侧边栏 Android 6.0 之前做Android 6.0开发的,都会了解到6.0的Settings加载选项是通过加载dash

  • 详解polyfills如何按需加载及场景示例详解

    目录 前言 青铜时代 火枪时代 webpack添加babel-loader @babel/preset-env @babel/polyfill 配置 useBuiltIns 加入 @babel/plugin-transform-runtime 前言 青铜时代 最使前端头痛的问题,莫过于浏览器兼容性,无论是js,还是css都要考虑浏览器兼容性问题,在webpack出来之前,这无非是一个非常头疼的问题,查到一个兼容性问题,查找很多资料,解决一下,再出来一个问题又要花很长时间解决一下,这无疑要花费很长

  • 详解vue-router的Import异步加载模块问题的解决方案

    1.问题现象 2.出现问题的代码点 3.替代方案: 把import() 替换成如下: Promise.resolve().then(()=>require(`@/views/${str}`)) 4.原因分析 项目在编译时,出现一个警告 这个警告的含义: require接收了一个变量,会报上面的警告,接收一个写死的字符串值时则没有警告! 我们通过控制台查看到import()对应编译过后的代码: 从上图可以看到require接收了一个变量,所以运行时出现了警告. 那这样就会报上面找不到对应的模块.

  • 详解asp.net core重新加载应用配置

    asp.net core重新加载应用配置Intro 我把配置放在了数据库或者是Redis里,配置需要修改的时候我要直接修改数据库,然后调用一个接口去重新加载应用配置,于是就尝试写一个运行时重新加载配置的接口. Configuration 重新加载实现 重新加载配置的接口其实很简单,经过看 Configuration 的源码可以知道,如果想要重新加载应用配置,需要一个 IConfigurationRoot 对象,而 IConfigurationRoot 其实可以直接拿注入服务中的 IConfigu

  • Javascript 异步加载详解(浏览器在javascript的加载方式)

    一.同步加载与异步加载的形式 1. 同步加载 我们平时最常使用的就是这种同步加载形式: <script src="http://yourdomain.com/script.js"></script> 同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止了后续的解析,因此停止了后续的文件加载(如图像).渲染.代码执行. js 之所以要同步执行,是因为 js 中可能有输出 document 内容.修改dom.重定向等行为,所以默认同步执行才是安全的. 以前的一般建议

  • 详解mybatis通过mapper接口加载映射文件

    通过 mapper 接口加载映射文件,这对于后面 ssm三大框架 的整合是非常重要的.那么什么是通过 mapper 接口加载映射文件呢? 我们首先看以前的做法,在全局配置文件 mybatis-configuration.xml 通过 <mappers> 标签来加载映射文件,那么如果我们项目足够大,有很多映射文件呢,难道我们每一个映射文件都这样加载吗,这样肯定是不行的,那么我们就需要使用 mapper 接口来加载映射文件 以前的做法: 改进做法:使用 mapper 接口来加载映射文件 1.定义

  • 详解webpack分包及异步加载套路

    最近一个小项目是用webpack来进行构建的.其中用到了webpack分包异步加载的功能.今天抽时间看了下webpack打包后的文件,大致弄明白了webpack分包及异步加载的套路. 由于这个小项目是用自己写的一个路由,路由定义好了不同路径对应下的模板及逻辑代码: webpack配置文件: var path = require('path'), DashboardPlugin = require('webpack-dashboard/plugin'), HtmlWebpackPlugin = r

  • 详解PHP文件的自动加载(autoloading)

    传统上,在PHP里,当我们要用到一个class文件的时候,我们都得在文档头部require或者include一下: <?php require_once('../includes/functions.php'); require_once('../includes/database.php'); require_once('../includes/user.php'); ... 但是一旦要调用的文档多了,就得每次都写一行,瞅着也不美观,有什么办法能让PHP文档自动加载呢? <?php func

  • 详解Angular结合zTree异步加载节点数据

    1 前提准备 1.1 新建一个angular4项目 参考://www.jb51.net/article/119668.htm 1.2 去zTree官网下载zTree zTree官网:点击前往 三少使用的版本:点击前往 1.3 参考博客 //www.jb51.net/article/133284.htm 2 编程步骤 从打印出zTree对象可以看出,zTree对象利用init方法来实现zTree结构:init方法接收三个参数 参数1:一个ul标签的DOM节点对象 参数2:基本配置对象 参数3:标题

  • 详解angularjs利用ui-route异步加载组件

    ui-route相比于angularjs的原生视图路由更好地支持了路由嵌套,状态转移等等.随着视图不断增加,打包的js体积也会越来越大,比如我在应用里面用到了wangeditor里面单独依赖的jquery就300多k.异步加载各个组件就很有必要.在这里我就以ui-route为框架来进行异步加载说明. 首先看一下路由加载文件 angular.module('webtrn-sns').config(['$stateProvider', function ($stateProvider) { $sta

随机推荐