跨apk获取Class、Resource等(一)

跨apk获取Class、Resource等(一)

  • 获取另一个apk里的类,并创建实例
  • Inflate另一个apk里的layout
  • 获取其他apk里layout里的view
  • 获取其他apk里的drawable
  • 获取其他apk里的array

获取另一个apk里的类,并创建实例
必须知道另一个apk包的PackageName和类的ClassName。
通过反射获取到构造函数,创建实例。
String packagePath = "com.lz.myapplication";
String classPath = "com.lz.myapplication.CircleView";

String apkName = null;
try {
    apkName = getPackageManager().getApplicationInfo(packagePath, 0).sourceDir;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
//create a PathClassLoader
PathClassLoader pathClassLoader = new dalvik.system.PathClassLoader(apkName, ClassLoader.getSystemClassLoader());

try {
    //获取到CircleView的反射
    Class<?> circleClass = Class.forName(classPath, true, pathClassLoader);
    //获取所有构造函数
    Constructor<?> cons[] = circleClass.getConstructors();
    //用第一个构造函数创建一个CircleView实例
    View circleView = (View) cons[0].newInstance(this);

    setContentView(circleView);
} catch (ClassNotFoundException e) {
    e.printStackTrace();
} catch (InstantiationException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}

Inflate另一个apk里的layout
必须知道另一个apk包的PackageName和layout名称。
先构造另一个apk的Context,然后Inflate
String foreignPackageName = "com.lz.myapplication";
String mylayoutName = "activity_main";
//create foreign context
Context context = null;
try {
    context = createPackageContext(foreignPackageName, Context.CONTEXT_INCLUDE_CODE
            | Context.CONTEXT_IGNORE_SECURITY);
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
//文档中说效率低如下,但为了分包忍了...
//Note: use of this function is discouraged. It is much more efficient to
//retrieve resources by identifier than by name
int resId = context.getResources().getIdentifier(mylayoutName, "layout", foreignPackageName);
LayoutInflater myInflater = LayoutInflater.from(context);
//不要给一个root
RelativeLayout myLayout = (RelativeLayout) myInflater.inflate(resId, null, false);
setContentView(myLayout);

View circleView = myLayout.getChildAt(0);

try {
    //获取到CircleView反射
    Class<?> circleClass = circleView.getClass();
    //获取到method "startAnimation"
    Method method = circleClass.getMethod("startAnimation");
    //让circleView实例做动作...
    method.invoke(circleView);
} catch (NoSuchMethodException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值