Androidプラグインテクノロジー--(二)インストール済みapkをロード
前編ではAndroidに動的にプラグインjarをロードすることを理解しましたが、実際のプラグイン運用では、Androidメインapkが1つまたは任意のプラグインapkを動的にロードすることがよくあります.このプラグインapkはインストール済みまたはインストールされていないものであってもよく、機能も単純なjarよりも豊富です.
この記事では、インストールされたapkをロードしてリソースを取得し、Activityにジャンプする方法について説明します.
インストールされたapkでは、システムが完全な「アーカイブ」を作成し、対応するapiがcontextを取得することで、リソースを容易にロードしたり、activityをジャンプしたりすることができます.直接コード:
まず、Hostプロジェクトは以下の通りです.
Pluginプロジェクトは簡単で、以下の通りです.
次は、インストールされていないapkとそのリソースをロードする方法について説明します.インストールされていないapkはシステムが何も知らないため、apiでコンテキストを取得することもできず、自然にリソースを取得することもできないので、別の手段でこの問題を解決するしかありません.
この記事では、インストールされたapkをロードしてリソースを取得し、Activityにジャンプする方法について説明します.
インストールされたapkでは、システムが完全な「アーカイブ」を作成し、対応するapiがcontextを取得することで、リソースを容易にロードしたり、activityをジャンプしたりすることができます.直接コード:
まず、Hostプロジェクトは以下の通りです.
public class MainActivity extends Activity {
private static final String PLUGIN_PACKAGE = "com.example.androidplugin";
private Context mPluginContext;
private Resources mPluginResources;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
Class<?> clazz = mPluginContext.getClassLoader().loadClass(
PLUGIN_PACKAGE + ".MainActivity");
startActivity(new Intent(mPluginContext, clazz));
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
loadInstalledApk();
}
private void loadInstalledApk() {
try {
mPluginContext = createPackageContext(PLUGIN_PACKAGE,
Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (mPluginContext != null) {
mPluginResources = mPluginContext.getResources();
int resId = mPluginResources.getIdentifier("hello_world", "string", PLUGIN_PACKAGE);
String text = mPluginResources.getString(resId);
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
}
}
}
Pluginプロジェクトは簡単で、以下の通りです.
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
次は、インストールされていないapkとそのリソースをロードする方法について説明します.インストールされていないapkはシステムが何も知らないため、apiでコンテキストを取得することもできず、自然にリソースを取得することもできないので、別の手段でこの問題を解決するしかありません.