參考文章:
http://blog.csdn.net/jiangwei0910410003/article/details/17679823
http://my.oschina.net/mutour/blog/179242
動態加載的兩個API:
DexClassLoader (可以加載jar/apk/dex)
PathClassLoader (只能加載已經安裝到Android系統中的apk文件)
開始單獨看一篇文章的時候好像都沒有成功,綜合了一下兩篇文章,纔得到正確的結果。
先新建插件的android工程,不需要界面,首先是接口類
package com.dynamic.interfaces;
import android.app.Activity;
/**
* 動態加載類的接口
*/
public interface IDynamic {
/**初始化方法*/
public void init(Activity activity);
/**自定義方法*/
public void showBanner();
public void showDialog();
public void showFullScreen();
public void showAppWall();
/**銷燬方法*/
public void destory();
}
接着是實現類package com.dynamic.impl;
import android.app.Activity;
import android.widget.Toast;
import com.dynamic.interfaces.IDynamic;
/**
* 動態類的實現
*
*/
public class Dynamic implements IDynamic{
private Activity mActivity;
@Override
public void init(Activity activity) {
mActivity = activity;
}
@Override
public void showBanner() {
Toast.makeText(mActivity, "我是ShowBannber方法", 1500).show();
}
@Override
public void showDialog() {
Toast.makeText(mActivity, "我是ShowDialog方法", 1500).show();
}
@Override
public void showFullScreen() {
Toast.makeText(mActivity, "我是ShowFullScreen方法", 1500).show();
}
@Override
public void showAppWall() {
Toast.makeText(mActivity, "我是ShowAppWall方法", 1500).show();
}
@Override
public void destory() {
}
}
將實現類打包成jar文件,在platform-tools目錄下,使用dx命令
dx --dex --output=dynamic_temp.jar dynamic.jar
這樣就生成了dynamic_temp.jar,這個jar和dynamic.jar有什麼區別呢?
其實這條命令主要做的工作是:首先將dynamic.jar編譯成dynamic.dex文件(Android虛擬機認識的字節碼文件),然後再將dynamic.dex文件壓縮成dynamic_temp.jar,當然你也可以壓縮成.zip格式的
在這裏遇到過沒有dx.bat文件夾的問題,就不能用這個命令,還是去其他地方拷貝過來的
新建android工程,這裏需要將插件工程中的接口類打包成jar導入過來
package com.example.testpl;
import com.dynamic.interfaces.IDynamic;
import dalvik.system.DexClassLoader;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
public class MainActivity extends Activity {
IDynamic lib;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String dexPath = "/sdcard/dynamic.jar";
DexClassLoader cl = new DexClassLoader(dexPath, MainActivity.this
.getDir("dex", 0).getAbsolutePath(), null, getClassLoader());
try {
Class libProviderClazz = cl.loadClass("com.dynamic.impl.Dynamic");
lib = (IDynamic) libProviderClazz.newInstance();
if (lib != null) {
lib.init(MainActivity.this);
}
} catch (Exception e) {
}
}
public void Btn(View v) {
lib.showDialog();
}
}
將命令生成的jar拷貝到sd卡上面就可以正常運行
注意loadClass對應的類名是插件工程中的實現類
第一篇文章中好像是用的PathClassLoader,沒有仔細研究
額外知識點
Context提供了一些有關文件的方法。
public File getDir(String name, int mode):name目錄名稱、mode權限
如果傳入的目錄不存在,系統會創建此目錄,路徑爲"/data/data/程序Package Name/app_name",name就是傳入的name。
public File getFileStreamPath(String name):name爲文件名稱,所取得的文件必須是放在/data/data/程序Package Name/files的文件。
public File getFilesDir():取得"/data/data/程序Package Name/files"這個目錄的File。
public FileInputStream openFileInput(String name):讀取文件,name爲文件名不能包含路徑,文件的路徑爲"/data/data/程序Package Name/files",如果文件不存在,將會出現FileNotFoundException。
public FileOutputStream openFileOutput(String name, int mode):寫文件,name爲文件名不能包含路徑,mode爲權限,文件的路徑爲"/data/data/程序Package Name/files"。