複数のプラットフォームをターゲットにするには、プロジェクトのビルド時に最小 SDK レベルとターゲット SDK レベルを指定します。ターゲット SDK ビルドにリンクするようにプロジェクトを構成します。現在のプラットフォームに存在しないメソッドに対して呼び出しを実行すると、Davlik VM は実行時例外を生成します。コンパイラは、最小限の SDK レベルで使用できない呼び出しに対して警告を生成します。クラス、メソッド、または特定の参照に関するこれらの警告を抑制するさまざまな Java @ 宣言があります。Eclipse で F2 キーを押して、適切な Java 装飾を自動生成します。威圧的に聞こえます。しかし実際には、警告によって比較的恐れることなくコーディングできます。
したがって、一般的なアプローチは次のとおりです。ターゲット SDK ライブラリに対してリンクします。上位の SDK ビルドのメソッドを使用するコードに @ 装飾を追加します。特定のビルドに固有のメソッドまたはクラスを装飾します。そして、「すべての警告はエラーである」というコーディングのルールに従って生きて死にます。
API レベルごとにアクティビティ全体を再実装するのはやり過ぎです。オーバーライドされたメソッドを使用したクラスの特殊化は、この種のことを行うのに適した方法ではありません。バインディングが複雑なため、この方法で作業することは困難です。より小さなヘルパー クラスまたは条件付きコードを使用する方がはるかに優れています。
ヘルパー クラスの記述にはさまざまな規則があります。基本的には、API レベルごとに個別の実装クラスであり、それぞれが共通のインターフェイスまたは抽象基本クラスを実装しています。Android 開発者ブログに記載されている方法は、それを行うための合理的な方法です。パターンには多くの小さなバリエーションがあり、すべて特定の API レベルのヘルパー クラスのインスタンスを取得することに基づいています。
このパターンの別の例は、google ActionBarCompat ライブラリで使用される IActionBarHelper インターフェイスです。その場合、Activity は Activity ではなく ActivityCompat を継承し、インスタンス メソッド ActivityCompat.getActionBarHelper() は、実行中のプラットフォームに適切な実装を提供する IActionBarHelper の実装を返します。この場合、実装にはかなりの量の初期化状態と、アクティビティに関連付けられた状態が含まれています。そのため、メンバー メソッドから実装を取得することは理にかなっています。
それにもかかわらず、Davlik VM はリンケージを持たないインライン メソッドを完全に処理できます。
if (Build.Version >= 10) {
Call an API 10 method.
}
また、完全にうまく機能します。Davlik VM は、LogCat のデバッグ メッセージを介して少し泣き言を言います。したがって、これを常に行うと、オーバーヘッドが発生する可能性があります。ダウンレベル プラットフォームで API-10 メソッドを実行する場合、Davlik ローダーは、呼び出しを実行する代わりに、実行時にランタイム例外をスローするコードを生成します。しかし、コードのリンクと読み込みは問題ありません。不足しているメソッドの実行を防ぐために必要なのは if ステートメントだけです。少量では、条件付きコードは完全に問題ありません。プラットフォーム固有のコードがたくさんある場合は、何らかの方法でプラットフォーム固有の機能をクラスにカプセル化することをお勧めします。
NFC の例のように、存在する機能または存在しない機能の場合、続行する最善の方法は、おそらくクラスにできるだけ多くの NFC 機能を実装することです。次に、メイン クラスまたはアクティビティのコードからそのクラスを条件付きで参照します。例えば:
void onCreate(...)
{
if (Build.Version >= 10)
{
mNfcReceiver = new NfcReceiver(getContext());
}
}
ダウンレベルのプラットフォームで機能を再実装するつもりはないので、ヘルパー クラス パターンはあまり役に立ちません。