シングルアクティビティスタイルでのAndroidSDKの作成

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'
}

この場合、ビルドの競合を取り除くことができます。そうでなければ、単にバージョンはありません。

結論

SDKの開発は、単純なAndroidアプリケーションと比較すると、はるかに困難ですが、場合によってはより興味深いものになります。また、最終製品の品質に対する要件は高くなります。何かが落ちても、それはあなたにとってではなく、クライアントにとっては非常に悪いことです。




All Articles