安卓SDK(库)能有一个应用程序类吗?

6

我正在编写一个 Android 库(SDK),将被主应用程序所使用。

主应用程序有自己的应用程序类,其中所有基本的初始化都会发生,例如 Dagger 和 Stetho 以及其他库。

我的 SDK 有它自己的基础应用程序类,其中应用程序级别的组件被初始化,例如 Dagger 2.10+(其中应用程序类实现 HasActivityInjector)、Stetho、Timber、LeakCanary 和一些其他的应用程序级别初始化。

在 Android 中是否可能有两个应用程序类?我猜不行,因为每个应用程序只创建一个进程。

我想知道将 SDK 应用程序类合并到主应用程序类中的最佳/推荐方法是什么。

对此的任何帮助/建议将不胜感激!

2个回答

3
在Android应用程序中,不可能有两个Application类,因为系统保证Application是单例的。因此,使用您的库的用户必须使用您的类或他们自己的类或扩展Android提供的类。
话虽如此,你可以做一些事情。
您可以提供一个Application类,让使用您的库的用户进行扩展。 这个类可以是抽象的,也可以不是,具体取决于您的设计。然而,请注意,仅仅这样做并不完美,因为它可能会限制您的库的用户,因为他们可能需要使用自己的类,或者可能想要使用另一个强制他们扩展另一个Application类的库。
因此,允许两者被认为是一种好的做法。提供一个Application类,您可以直接扩展它,一切都可以工作,或者提供一个不同的机制,在自定义类(在应用程序中)中初始化,您的库与之配合使用。
实际上,这正是dagger所做的。您可以从DaggerApplication扩展,或者您必须实现HasActivityInjector并自己注入DispatchingAndroidInjector,并实现一个方法,dagger可以使用该方法获取Injector。
另一种方法是创建自己的Singleton实例。一些库利用这一点,让您的库的用户通过初始化单例来配置某些内容(例如在他们的应用程序的onCreate方法中),然后您可以访问它。
有可能您已经使用过这样的库,例如Fabric / Crashlytics。
请注意,根据您的要求,这可能有些棘手,因为应用程序可能会被杀死,使用您的库的用户必须始终确保在唤醒单例实例时正确配置它(例如通过推送通知)。

1
你不能在你的sdk中从Application类继承,但是你可以构建一个类来初始化你的sdk,并从那里获取应用上下文并将其用于你想要的所有内容或初始化其他依赖项,例如dagger或需要在应用程序类中初始化的所有内容。
public class App extends Application {

    public static volatile Context applicationContext;

    @Override
    public void onCreate() {
        super.onCreate();

        Raychat.initialize(this,"sdgkdnsfjksdnzksdfmkofcn");
    }
}

public abstract class Raychat {

    @Nullable
    private static Raychat instance;


    public static synchronized Raychat client() {
        if (instance == null) {
            throw new IllegalStateException("Please call Raychat.initialize() before requesting client");
        } else
            return instance;
    }

    public static synchronized void initialize(Application application, String apiKey) {
        if (instance != null) {
            Log.i(TAG, "Raychat has been initialized");
        } else {
            instance = RealRaychat.create(application, apiKey);
            onCreate();
        }
    }

    private static void onCreate() {
        EmojiManager.install(new IosEmojiProvider());
        // other dependencies that you want to init on your app boot
    }
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接