以单一活动样式创建Android SDK

在为Android创建最终应用程序时,您不会因单一活动方法而感到惊讶。但是,在开发SDK时,我们走得更远并使用了No-Activity。现在让我们弄清楚为什么需要它,遇到的困难以及如何解决。

Android中的标准第三方SDK

外部SDK通常在Android中如何工作?打开Activity库,执行一些工作,必要时返回结果onActivityResult.

标准SDK工作流程。
标准SDK工作流程。

, SDK . SDK, :

所需的应用程序屏幕和SDK堆栈
SDK

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

SDK

  • SDK , - Activity SDK -.

  • , SDK. (: , ).

  • SDK Lock Screen. , Lock Activity.

No-Activity SDK

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

片段上没有活动的SDK
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'
}

在这种情况下,您将摆脱构建冲突。否则,根本就不会有版本。

结论

与简单的Android应用程序相比,SDK开发要困难得多,但有时会更有趣。此外,对最终产品质量的要求也更高-如果有任何问题,对您而言,它不会对您而是对您的客户而言,这是非常糟糕的。




All Articles