3

在库模块的清单中,我需要使用一个Application类。有可能在Android中做到这一点吗?

显现:

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

模块库清单:

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

4

2 回答 2

0

不幸的是,不可能有多个Application类,但有一些变通方法,具体取决于您要执行的操作。

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

这是因为Context应用程序中的每个对象都有一个对它的引用,可以通过getApplicationContext(). 没有提供多个应用程序上下文,也没有办法指定您想要“库应用程序上下文”还是“主应用程序上下文”。

假设您要做的是在应用程序启动时初始化库,您可以简单地创建一个空ContentProvider的 that'sandroid: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 初始化自身所做的事情:它在其清单中声明一个提供程序,并在that 的方法中执行其初始化onCreateContentProvider

于 2020-06-07T17:46:58.987 回答
0

您可以使用一个技巧。我们想象您的主要应用程序类是Application1,您的库应用程序类是Application2. 现在扩展你的 Application1from Application2。只记得调用inonCreate的onCreateApplication2Application1

public class Application1 extend Application2{
@Override
    public void onCreate() {
        super.onCreate();

        //your codes


}
于 2022-02-20T13:24:35.340 回答