Android SDK(库)可以有一个应用程序类吗?

时间:2018-09-19 07:04:39

标签: android sdk

我正在编写一个android库(SDK),它将由我的主应用程序使用。

主应用程序具有其自己的应用程序类,在该类中,所有的基本初始化均发生(例如Dagger和Stetho等库)。

我的SDK有自己的基本应用程序类,其中应用程序级组件的初始化类似于Dagger 2.10+(其中应用程序类实现HasActivityInjector)以及Stetho,Timber,LeakCanary和其他一些应用程序级初始化。

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

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

任何帮助/建议都很棒!

2 个答案:

答案 0 :(得分:0)

Android应用程序中不可能有两个Application类,因为系统保证该应用程序是单例。因此,使用您的库必须使用您自己的类或自己的类,或者从Android提供的类开始扩展。

话虽如此,你可以做几件事。

您可以提供一个Application类,您的库用户必须从该类进行扩展。 此类可以是抽象的,也可以不取决于您的设计。但是请注意,仅靠设计本身并不是一个完美的选择,因为它可能会限制您的库用户,因为他们可能不得不使用自己的类,或者可能希望使用另一个库来强制他们扩展另一个Application类。

因此,允许两者都被视为一种好的做法。提供一个您可以扩展的Application类,然后一切正常运行,或者提供一个不同的机制,该机制在自定义类(在应用程序内)中初始化,而您的库就可以使用该类。

实际上,这正是匕首的作用。您可以从DaggerApplication扩展,或者必须实现HasActivityInjector并自己注入DispatchingAndroidInjector,并实现dagger可用于获取Injector的方法。

另一种方法是创建自己的Singleton实例。一些库利用此功能,并通过初始化单例(例如,在其Apps onCreate方法中)使库的用户配置一些东西,然后您就可以访问它。

您是否已经使用过此类库,例如Fabric / Crashlytics。

请注意,这可能会很棘手,具体取决于您的要求,因为该应用可能会被杀死,并且库的用户必须始终确保,它们在唤醒时正确配置了单例实例(例如,通过推送通知) )。

答案 1 :(得分:0)

您不能从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
    }
}