Erstellen eines Android SDK im Einzelaktivitätsstil

Sie werden niemanden mit einem einzigen Aktivitätsansatz überraschen, wenn Sie eine endgültige Anwendung für Android erstellen. Wir sind jedoch noch weiter gegangen und haben bei der Entwicklung des SDK No-Activity verwendet. Lassen Sie uns nun herausfinden, warum es benötigt wurde, welche Schwierigkeiten aufgetreten sind und wie sie gelöst wurden.

Standard-SDKs von Drittanbietern in Android

Wie funktionieren externe SDKs normalerweise in Android? ActivityBibliothek öffnen , einige Arbeiten ausgeführt, das Ergebnis wird bei Bedarf zurückgegebenonActivityResult.

Standard SDK Workflow.
Standard SDK Workflow.

, SDK . SDK, :

Gewünschter Stapel von App-Bildschirmen und SDK
SDK

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

SDK

  • SDK , - Activity SDK -.

  • , SDK. (: , ).

  • SDK Lock Screen. , Lock Activity.

No-Activity SDK

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

No-Activity SDK für Fragmente
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'
}

In diesem Fall werden Sie den Build-Konflikt los. Andernfalls gibt es einfach keine Version.

Fazit

Die SDK-Entwicklung ist im Vergleich zu einer einfachen Android-Anwendung viel schwieriger, aber manchmal interessanter. Auch die Anforderungen an die Qualität des Endprodukts sind höher - wenn etwas fällt, fällt es nicht für Sie, sondern für Ihren Kunden, was sehr schlecht ist.




All Articles