在.NET上,我可以使用“reflection”在运行时加载DLL库。这允许我为我的应用程序构建一些附加组件。
在Android上,有什么方法可以执行类似的操作吗?我想制作一个插件,安装后,可以从我的Android应用程序调用。
我的第一个想法是为此附加组件构建另一个APK
。然后,我的应用程序应遍历已安装的软件包以查看加载项是否存在。
之后,我如何加载该软件包(及其拥有的活动)并在我的应用程序中使用它?另一个需要考虑的细节是add-on
需要访问主应用程序的同一个数据库。
有谁知道我怎么能这样做?
非常感谢!
答案 0 :(得分:9)
使用PackageManager,您可以在所有已安装的软件包(APK)中查询系统上的活动/等。 Android SDK中的ApiDemos示例代码在类com.example.android.apis.ApiDemos
中使用它。
代码示例:
void findAddOnActivities() {
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory("myPackage.intent.category.ADDON");
PackageManager pm = getPackageManager();
List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);
// list contains all activities that match your filters in mainIntent
}
清单摘录:
<activity
android:label="My external Add-on"
android:name=".addons.TestAddon" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="myPackage.intent.category.ADDON" />
</intent-filter>
</activity>
对于数据库访问和管理访问/修改安全性: 在清单中声明自己的权限:
<permission android:name="com.mycompany.myapp.database.permission.READ"
android:label="@string/read_permission" android:protectionLevel="signatureOrSystem"></permission>
<permission android:name="com.mycompany.myapp.database.permission.WRITE"
android:label="@string/write_permission" android:protectionLevel="signatureOrSystem"></permission>
protectionLevel标记将确保只有属于该图像的APK或使用与主应用程序相同的密钥签名的APK才能被授予该权限。
有多种方法可以让插件访问您的数据库。远程服务或提供接口将起作用。在应用程序中,我有这样做,我的主应用程序有一个名为DBManager的类,它已经对数据库进行了大量的读/写操作。所以我只是在我的外部应用程序中使用该类,它可以执行所有读取/写入,因为包使用相同的密钥进行签名。
如果您不想使用相同的密钥对包进行签名,请考虑使用示例代码RemoteService.java中的远程服务。有关详细信息,请查看android service dev guide。我不是Android服务专家,因此其他人的反馈可能会有所帮助。