android上的主题切换,Android从M开始加入了动态资源overlay机制 runtime resource overlay(RRO),这个是sony贡献的,实现机制如下图,就是在框架中建立一套资源ID映射表,通过这个映射表动态切换不同的主题。

image.png

具体的代码实现在 OverlayManagerService 代码中,

代码的架构如下,IdmapManager是生成对应的映射表。

Android framework

| ^

. . . | . . . . | . . . .

. | | .

. AIDL, broadcasts .

. intents | .

. | | . . . . . . . . . . . .

. v | . .

. OverlayManagerService . OverlayManagerTests .

. \ . / .

. (1) \ . / (3) .

. . . . . . . . . . \ . . . / . . . . . . . . .

. \ / .

. (2) \ / .

. OverlayManagerServiceImpl .

. | | .

. | | .

. OverlayManagerSettings IdmapManager .

. .

. . . . . . . . . . . . . . . . . . . . . .

通过 adb shell dumpsys overlay 命令可以查看系统里面的overlay包以及包的状态。

下面命令可以设置每个资源包的状态,设置成enable就会立即生效,(具体命令可以到代码里面查到shellcommand)

adb exec-out cmd overlay enable com.android.systemui.theme.dark

实现方法,把新主题的资源和目标apk的资源完全一致的ID,生成一套应用的资源,

<?xml version="1.0" encoding="utf-8"?>RRODemo这是原生应用的资源

overlay资源:

<?xml version="1.0" encoding="utf-8"?>这是rro加载的资源

这里需要替换的就是hello_world的显示内容,这个名字必须和待替换的资源名(hello_world)相同

manifest按照如下方式实现:

package="com.android.systemui.theme.dark"

android:versionCode="1"

android:versionName="1.0">

注意这个apk需要在大环境里面编译,编译的mk按照如下方式编写,注意签名。

LOCAL_PATH:=

(CLEAR_VARS)

LOCAL_RRO_THEME := SysuiDarkTheme

LOCAL_CERTIFICATE := platform

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res

LOCAL_PACKAGE_NAME := SysuiDarkThemeOverlay

LOCAL_SDK_VERSION := current

include $(BUILD_RRO_PACKAGE)

生成apk后push到 system/vendor/overlay里面。 就可以了。

android 动态切换主题,android动态主题切换(RRO 技术)相关推荐

  1. android动态改变菜单栏,Android动态设置主题(使用RxBus模式)

    之前写过一篇文章:RxBus的实现及简单使用.今天我们尝试使用RxBus动态切换主题. 一.定义主题颜色 color.xml #F44336 #D32F2F #F44336 #E91E63 #C218 ...

  2. Android主题换肤 无缝切换

    作者 _SOLID 关注 2016.04.17 22:04* 字数 4291 阅读 23224评论 123喜欢 679 今天再给大家带来一篇干货. Android的主题换肤 ,可插件化提供皮肤包,无需 ...

  3. Android主题换肤 无缝切换 你值得拥有

    链接:https://www.jianshu.com/p/af7c0585dd5b 天再给大家带来一篇干货. Android的主题换肤 ,可插件化提供皮肤包,无需Activity的重启直接实现无缝切换 ...

  4. Android 必知必会 - 动态切换着色模式和全屏模式

    如果移动端访问不佳,欢迎使用 ==> Github 版 通过代码动态切换页面的着色模式和全屏模式,兼容 Android 4.4 + . 本文假设读者已经了解着色模式和全屏模式(沉浸模式). 背景 ...

  5. vue + element-UI 实现深色模式和主题色动态切换

    vue + element-UI 实现深色模式和主题色动态切换 文章目录 vue + element-UI 实现深色模式和主题色动态切换 前言 深色模式和主题色动态切换 本地样式切换 主题色切换 el ...

  6. VUE动态切换皮肤 VUE动态切换背景图片 操作 / VUE 主题切换

    上正文  使用:root ,var()函数实现 1. 创建皮肤或主题 css目录 一个公共主题文件 theme.css,一个main.js引入文件theme-all.css,一个单独的 主题样式文件 ...

  7. android 动态设置windowbackground,android – windowBackground不会随主题而改变

    我的申请中有两个主题.我有一个蓝色背景的蓝色主题: @drawable/menu_hardkey_panel_actionbar @style/ButtonAppTheme @drawable/bgr ...

  8. android设置夜间模式切换,android主题切换(简单的白/夜间模式的切换)

    效果图: 实现: android:layout_width="match_parent" android:layout_height="match_parent" ...

  9. Android插件化开发之动态加载本地皮肤包进行换肤

    Android插件化开发之动态加载本地皮肤包进行换肤 前言: 本文主要讲解如何用开源换肤框架 android-skin-loader-lib来实现加载本地皮肤包文件进行换肤,具体可自行参考框架原理进行 ...

最新文章

  1. Microsoft training Kits
  2. python如何启动前端_python- 前端进阶
  3. unity3d软阴影和硬阴影的原理_Unity3D中两种默认阴影的实现
  4. linux cache fs,新闻|Linux 上将出现一个新的文件系统:bcachefs
  5. java web 来源页_Java:Java Web--分页效果
  6. ES6_对象简洁语法_note
  7. android 清除所有计时器,android-如何从onTick方法中清除CountDownTimer?
  8. Excel-DNA开发包:ExcelDna-0.34.6.zip下载
  9. mac下打开多个相同应用程序
  10. js使用的一些实用技巧
  11. dev项目属性按钮是灰色_【网页特效】11 个文本输入和 6 个按钮操作 特效库
  12. H.266/VVC代码学习:xCheckRDCostAffineMerge2Nx2N函数
  13. 大数据处理平台都有哪些?
  14. UE4 角色添加武器后 移动出现漂移
  15. Oracle练习题(三)
  16. 永久免费的抠图软件分享
  17. Fintech趣店总部(厦门)技术招聘
  18. string.h头文件
  19. tikz 折线 箭头_LaTeX技巧862:用 TikZ 实现带箭头的注释效果
  20. 初中数学抽象教学的案例_初中数学教学案例

热门文章

  1. 40个新鲜的 jQuery 插件,使您的网站用户友好
  2. pyautogui实现LOL宝典自动领取
  3. 基于 Tile PPU 的 Unity Camera Size 计算公式
  4. 直方图均衡化原理与实现
  5. 基于sql net客户服务关系管理企业信使企信通
  6. 深入解析 multipart/form-data
  7. 安装教程之Windows 11安装Linux子系统并运行Linux GUI应用
  8. wireshark解析达梦数据库协议
  9. Linux下常用软件压缩包方式安装
  10. 【动画教程】真封神南极服务端2.52架设第五集