我正在编写一个android库(SDK),它将由我的主应用程序使用。
主应用程序具有其自己的应用程序类,在该类中,所有的基本初始化均发生(例如Dagger和Stetho等库)。
我的SDK有自己的基本应用程序类,其中应用程序级组件的初始化类似于Dagger 2.10+(其中应用程序类实现HasActivityInjector)以及Stetho,Timber,LeakCanary和其他一些应用程序级初始化。
在Android中是否可以有两个应用程序类-我猜不是,因为为每个应用程序创建一个进程。
我想知道将SDK应用程序类纳入主应用程序类的最佳/推荐方法是什么。
任何帮助/建议都很棒!
答案 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
}
}