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? Activity
Bibliothèque ouverte , quelques travaux effectués, le résultat est retourné si nécessaireonActivityResult.
, SDK . SDK, :
, SDK . , , , MapFragment
Google. , , .
SDK
SDK , -
Activity
SDK -., SDK. (: , ).
SDK Lock Screen. , Lock
Activity
.
No-Activity SDK
, , , (Activity) SDK . - 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.