Creación de un SDK de Android en estilo de actividad única

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.

Flujo de trabajo estándar del SDK.
Flujo de trabajo estándar del SDK.

, SDK . SDK, :

Pila deseada de pantallas de aplicaciones y SDK
SDK

, SDK . , , , MapFragment Google. , , .

SDK

  • SDK , - Activity SDK -.

  • , SDK. (: , ).

  • SDK Lock Screen. , Lock Activity.

No-Activity SDK

, , , (Activity) SDK . - SDK . .

SDK sin actividad en fragmentos
No-Activity SDK

, . ?

No-Activity SDK

  • SDK , .. .

  • , SDK - childFragmentManager.

  • , .. .

No-ActivitySDK

  • , Single-Activity.

  • SDK , dagger - ( ).

  • SDK Activity .. requireActivity . SDK.

  • Activity onActivityResult, , , .

  • 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.




All Articles