插件開發,即動態加載

參考文章:

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"。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章