在应用程序和库模块的清单文件中包含多个应用程序类。

问题描述 投票:1回答:1

在库模块的清单中,我需要使用一个 Application 类。在安卓系统中是否可以这样做?

Manifest。

<application
    android:name="com.compnay.app.App"
    android:allowBackup="true"
    android:label="@string/app_name"
    >
</application>

模块库 Manifest:

<application
    android:name="com.example.mymodule.App"
    android:allowBackup="true"
    android:label="@string/app_name"
    >
</application>

android android-library android-application-class
1个回答
0
投票

很遗憾,不可能有多个的 Application 类,但也有一些变通的办法,这取决于你想做什么。

一个Android应用程序只能有一个 Application 子类,作为应用上下文使用。

这是因为每个 Context 中有一个引用,可以通过 getApplicationContext(). 没有规定多个应用上下文,也没有办法指定你是要 "库应用上下文 "还是 "主应用上下文"。

假设你要做的是在应用程序启动时初始化你的库,你可以简单地创建一个空的 ContentProvider 那是 android:exported="false" 并在它的 onCreate 方法。 这将在应用程序的 Application.onCreate.

<provider
    android:name="com.my.library.MyLibraryInitializer"
    android:authorities="${applicationId}.mylibrary-initializer"
    android:exported="false"/>
public class MyLibraryInitializer extends ContentProvider {
    @Override
    public boolean onCreate() {
        // perform your initialization here
        return true;
    }

    // Everything below here is just boilerplate to implement the abstract methods
    // in ContentProvider, no need to change it

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }
}

例如,WorkManager在初始化自己的时候就是这样做的:它用 在其清单中声明提供者中执行其初始化。onCreate 该法 ContentProvider.

© www.soinside.com 2019 - 2024. All rights reserved.