Android更换皮肤解决方案,做了6年Android开发

@Override

protected void onPreExecute() {

super.onPreExecute();

if (callback != null) {

callback.startloadSkin();

}

}

@Override

protected Resources doInBackground(String… params) {

try {

if (params.length == 1) {

//

String dexPath_tmp = params[0];

// 得到包管理器

PackageManager mpm = mContext.getPackageManager();

// 得到包信息

PackageInfo mInfo = mpm.getPackageArchiveInfo(

dexPath_tmp, PackageManager.GET_ACTIVITIES);

mPackageName = mInfo.packageName;

// AssetManager实例

AssetManager assetManager = AssetManager.class

.newInstance();

// 通过反射调用addAssetPath方法

Method addAssetPath = assetManager.getClass()

.getMethod(“addAssetPath”, String.class);

addAssetPath.invoke(assetManager, dexPath_tmp);

// 得到资源实例

Resources superRes = mContext.getResources();

// 实例化皮肤资源

Resources skinResource = new Resources(assetManager,

superRes.getDisplayMetrics(),

superRes.getConfiguration());

// 保存资源路径

SkinConfig.getInstance(mContext).setSkinResourcePath(

dexPath_tmp);

return skinResource;

}

} catch (Exception e) {

return null;

}

return null;

}

@Override

protected void onPostExecute(Resources result) {

super.onPostExecute(result);

mResources = result;

// 这里执行回调方法

if (callback != null) {

if (mResources != null) {

callback.loadSkinSuccess();

} else {

callback.loadSkinFail();

}

}

}

}.execute(dexPath);

}

public static interface loadSkinCallBack {

public void startloadSkin();

public void loadSkinSuccess();

public void loadSkinFail();

}

}

重点关注这个类,里面提供了一个异步方法对包和asset进行操作,这里用到了反射机制,反射调用addAssetPath来添加assets的路径,这个路径就是我们skin.apk的路径。具体细节,各位查看代码。

我们在Activity界面中使用上面提供的方法:

package com.devilwwj.skin;

import android.app.Activity;

import android.content.res.Resources;

import android.os.Bundle;

import android.os.Environment;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

import com.devilwwj.skin.SkinPackageManager.loadSkinCallBack;

/**

  • 功能:切换皮肤

  • @author devilwwj

*/

public class MainActivity extends Activity implements OnClickListener,

ISkinUpdate {

private static final String APK_NAME = “skin.apk”;

private static final String DEX_PATH = Environment

.getExternalStorageDirectory().getAbsolutePath() + “/skin.apk”;

private Button dayButton;

private Button nightButton;

private TextView textView;

private boolean nightModel = false;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

dayButton = (Button) findViewById(R.id.btn_day);

nightButton = (Button) findV

iewById(R.id.btn_night);

textView = (TextView) findViewById(R.id.text);

// 把apk文件复制到sd卡

SkinPackageManager.getInstance(this).copyApkFromAssets(this, APK_NAME,

DEX_PATH);

}

@Override

protected void onResume() {

super.onResume();

if (SkinPackageManager.getInstance(this).mResources != null) {

updateTheme();

}

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btn_day:

nightModel = false;

loadSkin();

break;

case R.id.btn_night:

nightModel = true;

loadSkin();

break;

default:

break;

}

}

/**

  • 加载皮肤

*/

private void loadSkin() {

SkinPackageManager.getInstance(this).loadSkinAsync(DEX_PATH,

new loadSkinCallBack() {

@Override

public void startloadSkin() {

Log.d(“xiaowu”, “startloadSkin”);

}

@Override

public void loadSkinSuccess() {

Log.d(“xiaowu”, “loadSkinSuccess”);

// 然后这里更新主题

updateTheme();

}

@Override

public void loadSkinFail() {

Log.d(“xiaowu”, “loadSkinFail”);

}

});

}

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

上面分享的百度、腾讯、网易、字节跳动、阿里等公司2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

【Android高级架构视频学习资源】

**Android部分精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
形式给大家展示一部分。

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

[外链图片转存中…(img-57Ixbm2w-1647757501727)]

【Android高级架构视频学习资源】

**Android部分精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值