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

reg*_*sxp 0 android add-on

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

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

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

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

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

非常感谢!

Mik*_*keC 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
}
Run Code Online (Sandbox Code Playgroud)

清单摘要:

    <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>
Run Code Online (Sandbox Code Playgroud)

对于数据库访问和管理访问/修改安全性:在清单中声明自己的权限:

<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>
Run Code Online (Sandbox Code Playgroud)

protectionLevel标记将确保只有作为图像一部分或使用与主应用程序相同的密钥签名的APK才能被授予该权限.

有多种方法可以让插件访问您的数据库.远程服务或提供接口将起作用.在应用程序中,我有这样做,我的主应用程序有一个名为DBManager的类,它已经对数据库进行了大量的读/写操作.所以我只是在我的外部应用程序中使用该类,它可以执行所有读取/写入,因为包使用相同的密钥进行签名.

如果您不想使用相同的密钥对包进行签名,请考虑使用示例代码RemoteService.java中的远程服务.查看android服务开发指南了解更多详情.我不是Android服务专家,所以来自其他人的反馈可能会有所帮助.