Android - 构建支持附加组件的应用程序

时间:2012-02-11 00:50:47

标签: android add-on

在.NET上,我可以使用“reflection”在运行时加载DLL库。这允许我为我的应用程序构建一些附加组件。

在Android上,有什么方法可以执行类似的操作吗?我想制作一个插件,安装后,可以从我的Android应用程序调用。

我的第一个想法是为此附加组件构建另一个APK。然后,我的应用程序应遍历已安装的软件包以查看加载项是否存在。

之后,我如何加载该软件包(及其拥有的活动)并在我的应用程序中使用它?另一个需要考虑的细节是add-on需要访问主应用程序的同一个数据库。

有谁知道我怎么能这样做?

非常感谢!

1 个答案:

答案 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服务专家,因此其他人的反馈可能会有所帮助。