获取外部Apk资源的实体类:
public class ForeignPackage {
public final static String TAG = "ForeignPackage";
private String packageName;
private Context foreignCtx;
public ForeignPackage(Context ctx, String packageName) throws NameNotFoundException{
this.packageName = packageName;
foreignCtx = ctx.createPackageContext(packageName, Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
}
//获取该apk的上下文
public Context getContext(){
return foreignCtx;
}
//获取该apk的asset
public AssetManager getAssets(){
return foreignCtx.getAssets();
}
//获取该apk的Class
public Class<?> loadClass(String className) throws ClassNotFoundException{
return foreignCtx.getClassLoader().loadClass(className);
}
//ID: 形如R.layout.main
public int getResourceID(String sID){
int mID = -1;
if(sID.indexOf('.') == -1 || sID.indexOf('.') == sID.length() - 1){
return -1;
}
//String className = "com.apktest.R$attr";
String className = packageName + "." + sID.substring(0, sID.lastIndexOf('.')).replace('.', '$');
String idName = sID.substring(sID.lastIndexOf('.') + 1);
try {
Class<?> c = loadClass(className);
Field field = c.getField(idName);
mID = field.getInt(null);
} catch (ClassNotFoundException e) {
Log.e(TAG, "className Not Found:" + className);
return -1;
} catch (SecurityException e) {
Log.e(TAG, "SecurityException:" + sID);
return -1;
} catch (NoSuchFieldException e) {
Log.e(TAG, "The Field Not Found:" + idName);
return -1;
} catch (Exception e) {
Log.e(TAG, "Exception:" + e);
return -1;
}
return mID;
}
//获取该apk包中的string资源
public String getString(String id){
int mID = getResourceID(id);
if(mID == -1){
return null;
}
String s = null;
try {
s = foreignCtx.getResources().getString(mID);
} catch (Exception e) {
Log.e(TAG, "Exception:" + e);
}
return s;
}
//获取该apk包中的color资源
public int getColor(String id){
int mID = getResourceID(id);
if(mID == -1){
return -1;
}
int color = -1;
try {
color = foreignCtx.getResources().getColor(mID);
} catch (Exception e) {
Log.e(TAG, "Exception:" + e);
}
return color;
}
//获取该apk包中的drawable资源
public Drawable getDrawable(String id){
int mID = getResourceID(id);
if(mID == -1){
return null;
}
Drawable d = null;
try {
d = foreignCtx.getResources().getDrawable(mID);
} catch (Exception e) {
Log.e(TAG, "Exception:" + e);
}
return d;
}
//获取该apk包中的layout资源
public View getLayout(String id){
int mID = getResourceID(id);
if(mID == -1){
return null;
}
LayoutInflater inflate = (LayoutInflater)foreignCtx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
return inflate.inflate(mID, null);
}
//获取该apk包中的animation资源
public Animation getAnimation(String id){
int mID = getResourceID(id);
if(mID == -1){
return null;
}
Animation a = null;
try {
a = AnimationUtils.loadAnimation(foreignCtx, mID);
} catch (Exception e) {
Log.e(TAG, "Exception:" + e);
}
return a;
}
//获取该apk包中的类实力,className为类名,args为类的构造函数参数
public Object getClassInstance(String className, Object...args) throws ClassNotFoundException{
Class<?> c = loadClass(className);
try {
Class<?>[] cs = new Class<?>[args.length];
int i = 0;
for(Object arg : args){
cs[i++] = InstanceMapping.classTypeFormat(arg.getClass());
}
Constructor<?> ct = c.getConstructor(cs);
return ct.newInstance(args);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
}
分享到:
相关推荐
"android导出实体表格工具类"就是这样一个功能,它能够帮助开发者将Java Bean集合转换成XLS格式的Excel文件,并存储到设备的SD卡上。下面我们将详细探讨这个工具类的工作原理、实现方式以及其在实际应用中的价值。 ...
例如,可以创建一个`AppUpdateInfo`实体类,包含`versionCode`(版本号)、`downloadUrl`(下载链接)等字段。解析完成后,如果本地版本低于服务器版本,即可提示用户进行更新。 接下来,我们探讨jar包更新。这种...
本话题聚焦于“捕鱼达人”这类游戏,通过分析标题中的"PlayerEntity.rar_cocos2dx 捕鱼",我们可以探讨cocos2dx框架下如何实现游戏中的玩家实体(PlayerEntity)以及如何对游戏中的金钱和级别进行修改。 首先,...
8. **Medicine_Record**:这可能是一个目录,包含了处理药品记录的相关类或文件,比如药品实体类、药品数据库操作类等。 9. **事件监听与回调**:应用可能使用了各种事件监听器,如点击事件、触摸事件,以及接口回...
- 研究数据库模块,了解ORM实现,如实体类的映射、SQL语句的生成等。 - 分析网络请求部分,查看其如何封装HttpURLConnection或OkHttp进行网络通信。 - 探索图片加载组件,了解缓存策略和图片处理流程。 通过以上...
封装使数据和方法在类内部受到保护,防止外部代码的直接访问。继承允许子类从父类中继承属性和行为,多态则允许不同类型的对象对同一消息作出响应。 2. **类和对象**:每个Java程序都由一个或多个类构成,类定义了...
知识点:正向代理是指客户端无法访问外部资源时,通过一个正向代理去间接地访问外部资源。反向代理是指客户端无感知代理的存在,以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并...
依赖注入的基本思想是,对象不应自行创建或查找其依赖项,而是应由外部实体提供。这样可以降低对象之间的耦合度,使代码更易于理解和测试。 Roboguice通过注解(Annotations)来实现依赖注入。开发者只需在类或方法...