当前哪些API可用于动态加载
DexClassLoader
这个可以加载jar/apk/dex,也可以从SD卡中加载。
PathClassLoader
只能加载已经安装到Android系统中的apk文件。
一、工程TestB
1、ITest.java
package cn.jiepu.testb; public interface ITest { String getMoney(); }
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"/>