user3742866
user3742866

Reputation: 156

Multiple Application classes in app's and library module's manifest files

In the library module's manifest, I need to use an Application class. Is it possible to do this in Android?

Manifest:

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

Module library Manifest:

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

Upvotes: 6

Views: 2475

Answers (2)

behrad
behrad

Reputation: 1278

There is a trick that you can use. We imagine your main application class is Application1 and your library application class is Application2. Now extend your Application1 from Application2. Just remember to call onCreate of Application2 in Application1's onCreate

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

        //your codes


}

Upvotes: 4

Ryan M
Ryan M

Reputation: 20197

Unfortunately, it's not possible to have multiple Application classes, but there are workarounds, depending on what you're trying to do.

An Android application can only have a single Application subclass that's used as the application context.

This is because every Context in the app has a reference to it that can be retrieved by getApplicationContext(). There's no provision for multiple application contexts, and no way to specify whether you want the "library application context" or the "main application context."

Assuming that what you want to do is initialize your library on app startup, you can simply create an empty ContentProvider that's android:exported="false" and do your initialization in its onCreate method. This will be called before the app's 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;
    }
}

This is, for example, what WorkManager does to initialize itself: it declares a provider in its manifest and performs its initialization within the onCreate method of that ContentProvider.

Upvotes: 1

Related Questions