Android 换肤方案(2种)

来源:互联网 发布:数据库是什么软件 编辑:程序博客网 时间:2024/05/17 07:27

多的不说,先给出今天的参考链接
- 参考链接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;                }

对了,要记得加读写权限。
关于换肤方案,还是去看张鸿洋

0 0
原创粉丝点击