Membuat Android SDK dalam Single-Activity Style

Anda tidak akan mengejutkan siapa pun dengan pendekatan aktivitas tunggal saat membuat aplikasi final untuk Android. Tapi kami melangkah lebih jauh dan menggunakan No-Activity saat mengembangkan SDK. Sekarang mari kita cari tahu mengapa itu dibutuhkan, kesulitan yang dihadapi dan bagaimana mengatasinya.

SDK pihak ketiga standar di Android

Bagaimana SDK eksternal biasanya bekerja di Android? Buka Activityperpustakaan, melakukan beberapa pekerjaan, hasilnya dikembalikan jika perluonActivityResult.

Alur kerja SDK standar.
Alur kerja SDK standar.

, SDK . SDK, :

Tumpukan layar aplikasi dan SDK yang diinginkan
SDK

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

SDK

  • SDK , - Activity SDK -.

  • , SDK. (: , ).

  • SDK Lock Screen. , Lock Activity.

No-Activity SDK

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

SDK Tanpa Aktivitas di Fragmen
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'
}

Dalam hal ini, Anda akan menyingkirkan konflik build. Jika tidak, tidak akan ada versi.

Kesimpulan

Pengembangan SDK, jika dibandingkan dengan aplikasi Android sederhana, jauh lebih sulit, tetapi terkadang lebih menarik. Juga, persyaratan untuk kualitas produk akhir lebih tinggi - jika sesuatu jatuh, itu tidak akan jatuh untuk Anda, tetapi untuk klien Anda, yang sangat buruk.




All Articles