No sorprenderá a nadie con un enfoque de actividad única al crear una aplicación final para Android. Pero fuimos más allá y usamos No-Activity al desarrollar el SDK. Ahora averigüemos por qué fue necesario, las dificultades encontradas y cómo se resolvieron.
SDK estándar de terceros en Android
¿Cómo suelen funcionar los SDK externos en Android? ActivityBiblioteca abierta , realizó algún trabajo, el resultado se devuelve si es necesarioonActivityResult.

, SDK . SDK, :

, SDK . , , , MapFragment Google. , , .
SDK
SDK , -
ActivitySDK -., SDK. (: , ).
SDK Lock Screen. , Lock
Activity.
No-Activity SDK
, , , (Activity) SDK . - SDK . .

, . ?
No-Activity SDK
SDK , .. .
, SDK -
childFragmentManager., .. .
No-ActivitySDK
, Single-Activity.
SDK , dagger - ( ).
SDK
Activity..requireActivity. SDK.ActivityonActivityResult, , , .SDK, ..
Activity.
3rd party SDK
SDK. . , dagger2 .
Dagger2 SDK
dagger Application. SDK , Application, , .
, .
internal object ComponentHolder {
lateinit var appComponent: SdkAppComponent
private set
@Synchronized
fun init(ctx: Context) {
if (this::appComponent.isInitialized) return
appComponent = DaggerSdkAppComponent
.builder()
.sdkAppModule(SdkAppModule(ctx))
.build()
}
} , init, , SDK , . SDK. EntryPointFragment. SDK. SDK childFragmentManager.
EntryPointFragment ComponentHolder Dagger.
override fun onCreate(savedInstanceState: Bundle?) {
ComponentHolder.init(requireActivity())
ComponentHolder.appComponent.inject(this)
super.onCreate(savedInstanceState)
}, ComponentHolder, SDK .
okhttp3 major 4.+. Kotlin, , , code() . SDK, 3, 4 SDK, .
, . 2 flavor:
flavorDimensions("okhttpVersion")
productFlavors {
v3 {
dimension = "okhttpVersion"
}
v4 {
dimension = "okhttpVersion"
}
}
dependencies {
v3Api okhttp3.core
v3Api okhttp3.logging
v4Api okhttp4.core
v4Api okhttp4.logging
} , flavor , code() code.
// Code in v3 folder
class ResponseWrapper(private val response: Response) {
val code : Int
get() = response.code()
}// Code in v4 folder
class ResponseWrapper(private val response: Response) {
val code : Int
get() = response.code
}.
: , :
defaultConfig {
...
missingDimensionStrategy 'okhttpVersion', 'v4'
}En este caso, eliminará el conflicto de compilación. De lo contrario, simplemente no habrá una versión.
Conclusión
El desarrollo de SDK, en comparación con una simple aplicación de Android, es mucho más difícil, pero a veces más interesante. Además, los requisitos para la calidad del producto final son más altos: si algo cae, no caerá para ti, sino para tu cliente, lo cual es muy malo.