概要
Activity や Fragment で getSerializable(), getParcelable() で取得している処理から Deprecated の警告ができているケースがあるので、その対処方法についてメモしました。
対処方法
IntentCompat, BundleCompat を使用する形に書き換えるだけです。
Intentの場合(Activity でよくあるパターン)
intent.getSerializableExtra("my_key") as MyClass?
intent.getParcelableExtra<MyClass?>("my_key")
↓↓ 以下のような形に書き換える
IntentCompat.getSerializableExtra(intent, "my_key", MyClass::class.java)
IntentCompat.getParcelableExtra(intent, "my_key", MyClass::class.java)
Bundle場合(Fragment でよくあるパターン)
requireArguments().getSerializable("my_key") as MyClass?
requireArguments().getParcelable("my_key") as MyClass?
↓↓ 以下のような形に書き換える
BundleCompat.getSerializable(requireArguments(), "my_key", MyClass::class.java)
BundleCompat.getParcelable(requireArguments(), "my_key", MyClass::class.java)
これらのメソッドは何をしているのか?
こちらが IntentCompat.getSerializableExtra() の実装内容で、単にバージョンで分岐しているだけです。
public static <T extends Serializable> @Nullable T getSerializableExtra(@NonNull Intent in, @Nullable String key, @NonNull Class<T> clazz) {
if (Build.VERSION.SDK_INT >= 34) {
// Don't call this API on SDK 33 due to b/232589966.
return Api33Impl.getSerializableExtra(in, key, clazz);
} else {
Serializable serializable = in.getSerializableExtra(key);
return clazz.isInstance(serializable) ? (T) serializable : null;
}
}
なぜこんな面倒なことが必要?
API Level 33 から新しい getSerializable などの実装加わり、旧メソッドが Deprecated になった状態で リリースされましたが、リリース後に内部実装から NullPointerException が発生することがあるという以下の致命的な問題が発覚しました。
最終的に修正はされましたが、Android のバージョン更新が必要になるため、こうした Compat 系の実装が用意されたようです。