0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Android】バージョン分岐が必要な実装はCompat系の機能を使おう

Last updated at Posted at 2024-06-09

はじめに

対応範囲は広いプロジェクトなどは、そのバージョンに合わせて分岐するのが面倒ですよね。
そういったケースで便利なのがCoreKtxライブラリが提供するCompat系の機能ですが、実はかなりの種類が定義されていて、バージョンの分岐が必要な実装には大体Compat系の実装が用意されていたりします。
そこで今回はCompat系の実装を使うことでバージョン分岐を省略可能な実装をいくつかご紹介したいと思います。

準備

まず、Compat系の実装を使うには、以下ライブラリを導入する必要があります。

app/build.gradle
dependencies {
    implementation 'androidx.core:core-ktx:1.13.1'
}

上記ライブラリは最新のプラットフォーム機能とAPIをターゲットにしつつ、古いデバイスもサポート可能となるライブラリです。
まさにバージョン分岐が必要なケースの為に用意されているようなライブラリですね。

その1:ServiceCompat

サービス周りは最近特に厳しくてバージョン分岐も激しくなりがちですよね。
対象となるのが主にstartForegroundとstopForegroundだと思いますが、このServiceCompatを使うと分岐が必要なくなり、とても楽に実装可能です。

main.kt
// 修正前
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を使うとバージョン比較を省略できます。

main.kt
// 修正前
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の取得処理をシンプルに実装することが可能です。

main.kt
// 修正前
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代終わってそう😇

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?