跨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();
}
PathClassLoader pathClassLoader = new dalvik.system.PathClassLoader(apkName, ClassLoader.getSystemClassLoader());
try {
Class<?> circleClass = Class.forName(classPath, true, pathClassLoader);
Constructor<?> cons[] = circleClass.getConstructors();
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";
Context context = null;
try {
context = createPackageContext(foreignPackageName, Context.CONTEXT_INCLUDE_CODE
| Context.CONTEXT_IGNORE_SECURITY);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
int resId = context.getResources().getIdentifier(mylayoutName, "layout", foreignPackageName);
LayoutInflater myInflater = LayoutInflater.from(context);
RelativeLayout myLayout = (RelativeLayout) myInflater.inflate(resId, null, false);
setContentView(myLayout);
View circleView = myLayout.getChildAt(0);
try {
Class<?> circleClass = circleView.getClass();
Method method = circleClass.getMethod("startAnimation");
method.invoke(circleView);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}