上一篇我们了解了Android中动态加载插件jar,然而实际插件运用中,往往是Android主apk动态加载一个甚至任意个插件apk,这个插件apk可以是已安装的或未安装的,功能也比单纯的jar更丰富。
本篇我们将讨论如何加载一个已安装的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获取其上下文,自然也就无法获取其资源,所以只能通过别的手段来解决这个问题,下一篇再叙。