Création d'un SDK Android dans le style d'une seule activité

Vous ne surprendrez personne avec une approche d'activité unique lors de la création d'une application finale pour Android. Mais nous sommes allés plus loin et avons utilisé No-Activity lors du développement du SDK. Voyons maintenant pourquoi cela était nécessaire, les difficultés rencontrées et comment elles ont été résolues.

SDK tiers standard dans Android

Comment les SDK externes fonctionnent-ils généralement sous Android? ActivityBibliothèque ouverte , quelques travaux effectués, le résultat est retourné si nécessaireonActivityResult.

Flux de travail SDK standard.
Flux de travail SDK standard.

, SDK . SDK, :

Pile souhaitée d'écrans d'application et de SDK
SDK

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

SDK

  • SDK , - Activity SDK -.

  • , SDK. (: , ).

  • SDK Lock Screen. , Lock Activity.

No-Activity SDK

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

SDK sans activité sur les fragments
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'
}

Dans ce cas, vous vous débarrasserez du conflit de construction. Sinon, il n'y aura tout simplement pas de version.

Conclusion

Le développement de SDK, par rapport à une simple application Android, est beaucoup plus difficile, mais parfois plus intéressant. De plus, les exigences en matière de qualité du produit final sont plus élevées - si quelque chose tombe, cela ne tombera pas pour vous, mais pour votre client, ce qui est très mauvais.




All Articles