Android(安卓)换肤方案(2种)
16lz
2021-01-26
多的不说,先给出今天的参考链接
- 参考链接1 github代码地址
- 参考链接2 任玉刚动态加载机制
改装链接一中的代码
第一种方案的原理这里不说了,Android 换肤功能的实现(Apk插件方式),他这个有几个明显的缺陷(或许是作者懒得做?)
我在这里只是将上面的代码改成没快捷方式,代码安装。
去除快捷方式;
在皮肤资源的配置文件中去掉下面一行
<category android:name="android.intent.category.LAUNCHER" />
代码安装,我这里是直接安装SD卡中的apk文件。如何将apk放置到SD卡下,打开DDMS,导入文件即可。
String filepath = Environment.getExternalStorageDirectory()+"/myskin-debug.apk"; Log.e(TAG,filepath); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse("file://"+filepath),"application/vnd.android.package-archive"); startActivity(intent);
上面的方式中还是有安装提示界面。这一点非常差。
- 最严重的缺陷就是需要安装,虽然原理上有静默安装和静默写在。但是实现起来还是有困难。
动态加载
因为上面的缺陷,导致那种方法不会被用到生产环境中,我们来看动态加载的方法。其实非常简单。代码如下。
AssetManager assetManager = null; try { assetManager = AssetManager.class.newInstance(); Method addAssetPath = assetManager.getClass().getMethod("addAssetPath",String.class); addAssetPath.invoke(assetManager,Environment.getExternalStorageDirectory()+"/myskin-debug.apk"); mAssetManager= assetManager; } catch (Exception e) { Log.e(TAG, "onClick: "+e.getMessage() ); e.printStackTrace(); } Resources resources = getApplicationContext().getResources(); Resources mResources = new Resources(assetManager,resources.getDisplayMetrics(),resources.getConfiguration());// Drawable drawable = mSkinContext.getResources().getDrawable(mResId[mCount]); Drawable drawable = mResources.getDrawable(mResId[mCount]); mTopbar.setBackground(drawable); mBottomBar.setBackground(drawable); mCount++; if (mCount > 2) { mCount = 0; }
对了,要记得加读写权限。
关于换肤方案,还是去看张鸿洋
更多相关文章
- Android(安卓)网络请求,应用的下载与安装
- Android中AIDL的使用(一) 之 AIDL经典示例
- 如何确定Android中刚修改后的c/c++是否编译成功
- 关于Android(安卓)EditText图文混排的总结
- Gradle Kotlin DSL , 你知道它吗?
- 【Android(安卓)学习记录】:针对Android(安卓)7.0 抓不到HTTPS包
- MonoDroid学习笔记(一)―― 搭建MonoDroid开发环境及Hello World
- Android实现深度链接(APP外带动态参数唤醒APP,并跳转指定页面,APP
- 安卓系统架构多年经验总结:《Android程序的编译,安装和运行》 | An