Android — создайте приложение, поддерживающее надстройки

В .NET я могу использовать «отражение» для загрузки библиотеки DLL во время выполнения. Это позволяет мне создавать дополнения к моим приложениям.

На Android есть способ выполнить что-то подобное? Я хотел бы сделать надстройку, которую после установки можно будет вызывать из моего приложения для Android.

Моя первая идея состоит в том, чтобы создать еще один APK для этого дополнения. Затем мое приложение должно просмотреть установленные пакеты, чтобы увидеть, присутствует ли надстройка.

После этого, как я могу загрузить этот пакет (и его действия) и использовать его в своем приложении? Еще одна деталь, которую следует учитывать, заключается в том, что add-on должен иметь доступ к той же базе данных, что и основное приложение.

Кто-нибудь знает, как я могу это выполнить?

Большое спасибо!


person regisxp    schedule 11.02.2012    source источник
comment
Андроид это Ява. Насколько я помню, Reflections были введены в Java. Вы можете использовать ту же технику, не так ли?   -  person Aleksandr Kravets    schedule 11.02.2012


Ответы (1)


Используя PackageManager, вы можете запрашивать Activity/etc в системе во всех установленных пакетах (APK). Пример кода ApiDemos в Android SDK использует это в классе 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, которые являются частью образа или подписаны тем же ключом, что и основное приложение.

Есть много способов, чтобы аддон получил доступ к вашей базе данных. Удаленная служба или предоставление интерфейса будут работать. В моем приложении, которое делает это, мое основное приложение имеет класс с именем DBManager, который уже выполняет ряд операций чтения/записи в базу данных. Поэтому я просто использую этот класс в своем внешнем приложении, и он может выполнять все операции чтения/записи, поскольку пакеты подписаны одним и тем же ключом.

Если вы не хотите использовать один и тот же ключ для подписи пакетов, рассмотрите возможность использования удаленной службы, такой как в примере кода RemoteService.java. Дополнительную информацию см. в руководстве для разработчиков служб Android. Я не эксперт по службам Android, поэтому любые отзывы других, вероятно, будут полезны.

person MikeC    schedule 11.02.2012
comment
Рад, что помог кому-то :) Дайте мне знать, если у вас есть проблемы или улучшения! - person MikeC; 14.03.2012