はじめに
対応範囲は広いプロジェクトなどは、そのバージョンに合わせて分岐するのが面倒ですよね。
そういったケースで便利なのがCoreKtxライブラリが提供するCompat系の機能ですが、実はかなりの種類が定義されていて、バージョンの分岐が必要な実装には大体Compat系の実装が用意されていたりします。
そこで今回はCompat系の実装を使うことでバージョン分岐を省略可能な実装をいくつかご紹介したいと思います。
準備
まず、Compat系の実装を使うには、以下ライブラリを導入する必要があります。
dependencies {
implementation 'androidx.core:core-ktx:1.13.1'
}
上記ライブラリは最新のプラットフォーム機能とAPIをターゲットにしつつ、古いデバイスもサポート可能となるライブラリです。
まさにバージョン分岐が必要なケースの為に用意されているようなライブラリですね。
その1:ServiceCompat
サービス周りは最近特に厳しくてバージョン分岐も激しくなりがちですよね。
対象となるのが主にstartForegroundとstopForegroundだと思いますが、このServiceCompatを使うと分岐が必要なくなり、とても楽に実装可能です。
// 修正前
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
startForeground(
id,
notification,
type
)
} else {
startForeground(
id,
notification
)
}
// 修正後
ServiceCompat.startForeground(
service,
id,
notification,
type
)
気持ちいいくらいシンプルにかけますね、約半分になるので最高です。
stopForegroundも同じなので是非積極的に使っていきたいところです。
その2:ContextCompat
これは言わずと知れたみなさんご存じのCompatクラスですね。
その1と同じService関連ですが、以下もContextCompatを使うとバージョン比較を省略できます。
// 修正前
val serviceIntent = Intent(context, TestService::class.java)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(serviceIntent)
} else {
context.startService(serviceIntent)
}
// 修正後
val intent = Intent(context, TestService::class.java)
ContextCompat.startForegroundService(context, intent)
やはりバージョンの分岐がないというだけで本当にスッキリしますね。
ContextCompatには便利な機能がたくさんあるので、是非追ってみてください。
その3:BundleCompat
名前の通りBundle関連のヘルパークラスになりますが、こちらを利用することでParcelableの取得処理をシンプルに実装することが可能です。
// 修正前
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
intent.getParcelableExtra("key", ComponentName::class.java)
}
// 修正後
BundleCompat.getParcelable(
bundle,
"key",
TestData::class.java
)
ボリュームは他のに比べてそこまで変わりませんが、呼び出しがシンプルで見やすいですね。
ご紹介した以外にもたくさんあるので、バージョンでの分岐が必要になったらまず省略する方法がないかを探してみてください。
さいごに
つい先日30代になったと思ったらもう一年経過していました。
1年が一瞬過ぎて気がついたら30代終わってそう😇