Android插件化的思考——仿QQ一键换肤,思考比实现更重要!

关于QQ的换肤,他们的实现思路我不是很清楚,但是你可以看一下这张换肤的截图

我们想使用哪个主题就直接下载就好了,这一实现的过程我们大致的可以猜想:

首选是下载到本地指定文件夹,然后通过插件加载到我们的apk,最后应用为皮肤,逻辑大致是这样的逻辑了,那我们是不是应该动动手啊动动脑?

首选我们新建一个工程好了——PlugInSample

一.实现思路

其实说起来,这个插件的实现思路,确实是比较的麻烦,思来想去,还是一种办法比较靠谱,首先,我们刻意去获取手机上所有的安装的/未安装的程序,过滤掉没用的,留下我们的插件apk,我们的插件apk怎么去辨别呢?我们可用通过设置sharedUserId,然后用实体类把插件名称和包名保存下来,有了包名,就比较好说了,我们可用获取插件的上下文,也就是createPackageContext,然后就可以做点坏事了,我们可以去剖析我们的R文件

因为R文件里面都是静态的原因,我们很容易联想到反射机制,是的,我们可以再一次过滤掉无用的信息,通过我们的PathClassLoader去加载,访问我们的内加载器反射到我们的图片ID,也就是后面的那段数字,然后,嘿嘿,就可以使用了,是不是思路比较清晰了?这里要注意的就是图片命名统一,这样就比较号过来,那具体我们应该怎么做?

二.PlugIn主程序

我们写一个Spinner,每次切换就直接换肤怎么样?OK,每次换的时候就从插件APK里加载我们的图片资源,看起来是比较顺畅的逻辑,那我们具体该怎么做呢?

android:id="@+id/mLinearLayout"

xmlns:android="/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center"

android:orientation="vertical">

android:id="@+id/mSpinner"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

1.初始化

/**

* 初始化View

*/

private void initView() {

//初始化控件

mSpinner = (Spinner) findViewById(R.id.mSpinner);

}

当然,我这刚应用就一个View,但是实际开发当中可不止,所以步骤一定要明了

2.获取所有的插件

/**

* 获取手机里的插件

*

* @return

*/

private List findPlugIn() {

mList = new ArrayList<>();

//获取相关信息

PackageManager mPackageManager = getPackageManager();

//获取卸载/未安装的安装包信息

List mUninstallPackage = mPackageManager.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);

//遍历拿到我们的信息

for (PackageInfo info : mUninstallPackage) {

String pkgNmae = info.packageName;

//获取shareId,根据id判断是否是我们的ID

String shareUserId = info.sharedUserId;

if (!TextUtils.isEmpty(shareUserId)) {

//如果id相同

if (shareUse

android 仿qq换肤功能,Android插件化的思考——仿QQ一键换肤,思考比实现更重要!.doc...相关推荐

  1. android换主题功能,Android 切换主题风格(Theme换肤效果)

    参考 截图 1.默认打开 image.png 2.点击[换主题色] image.png 需知 主题色运用:manifest清单文件中application的属性之一,android:theme=&qu ...

  2. android仿微信发布动态功能,Android仿微信朋友圈发布动态功能

    一.前言 应工作上的要求,需要有一个类似于微信朋友圈发动态上传图片的功能,想起曾经已经做过了,但奈何不忍看自己以前写的代码的惨状,觉得重新封装一个使用方便,易于维护的类似功能的类,自己之后用起来也顺手 ...

  3. android handler的机制和原理_Android 插件化原理——Hook机制之AMSamp;PMS解析

    在前面的文章中我们介绍了DroidPlugin的Hook机制,也就是代理方式和Binder Hook:插件框架通过AOP实现了插件使用和开发的透明性.在讲述DroidPlugin如何实现四大组件的插件 ...

  4. android:使用small一步步实现插件化与热更新

    由于插件化开发与热更新最近貌似越来越火,新开的项目准备也使用插件化进行开发!其中遇到不少坑,在这里写了一个小的例子,记录一下开发流程,有助于自己,同时希望能够帮助大家理解,并且对于自身项目接入插件化有 ...

  5. android中最新webview的功能,Android WebView实现截长图功能

    本文实例为大家分享了Android实现截长图功能的具体代码,供大家参考,具体内容如下 先看看手机自带的长截屏功能:  机型: vivo x9 plus 大胆推测实现逻辑: 1:需要一个可以滚动的Vie ...

  6. android 微信朋友圈 全功能,Android仿微信朋友圈文字展开全文功能 Android自定义TextView仿微信朋友圈文字展开全文功能...

    Android自定义TextView仿微信朋友圈文字信息,展开全文功能 代码及注释如下: 首先写一个xml文件 showmore.xml: android:orientation="vert ...

  7. android仿微信发布动态功能,Android GridView扩展仿微信微博发图动态添加删除图片功能.pdf...

    Android GridView扩扩展展仿仿微微信信微微博博发发图图动动态态添添加加删删除除图图片片功功能能 这篇文章主要为大家详细介绍了Android GridView扩展仿微信微博发图动态添加删除 ...

  8. android的实现关注好友功能,android仿微信好友列表功能

    android studio实现微信好友列表功能,注意有一个jar包我没有放上来,请大家到MainActivity中的那个网址里面下载即可,然后把pinyin4j-2.5.0.jar复制粘贴到项目的a ...

  9. android仿微信语音聊天功能,Android仿微信发送语音消息的功能及示例代码

    微信的发送语音是有一个向上取消的,我们使用ontouchlistener来监听手势,然后做出相应的操作就行了. 直接上代码: //语音操作对象 private mediaplayer mplayer ...

最新文章

  1. iOS开发几年了,你清楚OC中的这些东西么!!!?
  2. DateEdit如果开启Vista模式并显示日期+时间模式
  3. 网站建设全阶段培养共分三期
  4. 1.2.2 时间复杂度
  5. c语言 12大于12么,【C语言】第十二章
  6. 部署可道云_可道云-快速搭建个人用云网盘
  7. python 字符串去空格_Python去除、替换字符串空格的处理方法
  8. python elasticsearch模块_Python3 操作 elasticsearch
  9. 十大笔记本电脑排行_2020双十一,十大高性价比游戏笔记本电脑值得买排行榜之搭载144Hz电竞屏机型(配置推荐)福利放送...
  10. VMWare:打开虚拟机黑屏
  11. cnn 一维时序数据_多角度理解CNN网络
  12. 计算机分子模拟聚乙烯,分子动力学模拟超高分子量聚乙烯
  13. 面试官:如何实现单行/多行文本溢出的省略样式?
  14. 用户密钥管理方案 密钥托管 授权托管
  15. UGUI源码剖析(CanvasUpdateSystem 画布刷新系统)
  16. Web前端开发十日谈
  17. 电子计算机里CE,电子计算机上的ce表示什么意思
  18. css 实现弹框滚动条
  19. 弘辽科技:降低ppc的3个环节4个核心点 。
  20. Coreldraw支持的所有文件格式

热门文章

  1. 一个分析飞信的牛人网站
  2. html js 常用技巧
  3. Git系列(二)、Git连接远程仓库(Gitee码云)
  4. 如何得到tusimple数据
  5. 10-QNX与Android双系统通讯之FDBUS(1)
  6. Linux部署SFTP服务
  7. VS2015性能分析过程
  8. 可以检测手机帧率和温度的软件_小米10应该是性价比最高最适合玩游戏的安卓手机之一了吧?...
  9. 取消京津冀手机漫游费更像文字游戏
  10. 首发 成功移植OpenHarmony到龙芯开发板,代码开源