当前哪些API可用于动态加载
DexClassLoader
这个可以加载jar/apk/dex,也可以从SD卡中加载。
PathClassLoader
只能加载已经安装到Android系统中的apk文件。
一、工程TestB
1、ITest.java
package cn.jiepu.testb;
public interface ITest {
String getMoney();
}
2、TestBActivity.java
package cn.jiepu.testb;
import android.os.Bundle;
import android.app.Activity;
public class TestBActivity extends Activity implements ITest{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public String getMoney() {
return "hehe";
}
}
将生成后的TestB.apk拷贝到SD卡的根目录下。
二、工程TestA
1、TestAActivity.java
package cn.jiepu.testa;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import dalvik.system.DexClassLoader;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
import android.app.Activity;
public class TestAActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String path=Environment.getExternalStorageDirectory()+"/";
String fileName="TestB.apk";
DexClassLoader classLoader=new DexClassLoader(path+fileName, path, null, getClassLoader());
try {
Class mLoadClass=classLoader.loadClass("cn.jiepu.testb.TestBActivity");
Constructor constructor=mLoadClass.getConstructor(new Class[]{});
Object TestBActivity=constructor.newInstance(new Object[]{});
Method getMoney=mLoadClass.getMethod("getMoney", null);
getMoney.setAccessible(true);
Object money=getMoney.invoke(TestBActivity, null);
Toast.makeText(this, money.toString(), Toast.LENGTH_LONG).show();
Log.i("wjh", "success");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
添加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>