在android上,当一个app想使用另外一个app的api时怎么办呢,现在做一个小例子:
有两个app,一个是Plugin,一个是Home代码分别如下:
首先是在plugin中实现一个类,类里面有一个add方法,该方法就是时间两个整型数的加法:
public class AddOperation {
public int addOperation(int arg1, int arg2){
Log.i("AddOperation", "addOperation is called!");
return arg1 + arg2;
}
}
在这个app中,在AndroidManifest.xml中加入一个空的activity,并加入一个和Home app 约定好的intent action:
<activity android:name="com.example.plugin.MainActivity">
<intent-filter >
<action android:name = "com.xiaocao.android.plugin.add"/>
</intent-filter>
</activity>
在Home里面实现调用plugin:
private void callPlugin(){
/** 和plugin约定好的intent action,用来寻找plugin package*/
Intent intent = new Intent("com.xiaocao.android.plugin.add",null);
PackageManager pm = getPackageManager();
/** 涨到符合该intent action的plugins*/
List<ResolveInfo> plugins= pm.queryIntentActivities(intent, 0);
/** 因为是自己定义的action,符合的就只有一个,所有取第一个*/
ResolveInfo resolveInfo = plugins.get(0);
ActivityInfo activityInfo = resolveInfo.activityInfo;
/** 取到plugin的包名*/
String packageName = activityInfo.packageName;
Log.i("Home", " plugin packageName is: " + packageName);
/** 取到plugin文件所在位置*/
String dexPath = activityInfo.applicationInfo.sourceDir;
Log.i("Home", " plugin dexPath is: " + dexPath);
/** 取到Home的路径,将要解压plugin的dex文件到该位置*/
String dexOutputPath = getApplicationInfo().dataDir;
Log.i("Home", " dex output path is: " + dexOutputPath);
/** 取到plugin library文件所在位置*/
String libPaht = activityInfo.applicationInfo.nativeLibraryDir;
Log.i("Home", " plugin library path is: " + libPaht);
/** 初始化DesClassLoader*/
DexClassLoader dexClassLoader = new DexClassLoader(dexPath, dexOutputPath, libPaht,this.getClass().getClassLoader());
/** 利用java的反射机制,调用addOperation方法*/
try {
Class<?> cla = dexClassLoader.loadClass(packageName + ".AddOperation");
Object obj = cla.newInstance();
Class[] params = new Class[2];
params[0] = Integer.TYPE;
params[1] = Integer.TYPE;
Method method = cla.getMethod("addOperation", params);
int result = (Integer) method.invoke(obj, 10,50);
Log.i("Home", "the result is :" + result);
} catch (Exception e){
e.printStackTrace();
}
}
将两个app都装上,运行Home,log如下:
至此,调用成功结束。