0

異なる SDK バージョンのコンポーネントを組み合わせる方法を探しています。

たとえば、minSdkVersion="8" で正常に動作する APP があります。しかし、minSdkVersion="10" を必要とする追加機能が必要です。

多分プラグインのようなもので、動的にロードしますか?Android デバイスに minSdkVersion="10" がある場合、そのプラグインがロードされます。また、それより古いバージョンでは、SdkVersion="8" を使用した基本的な機能のみで動作します。

そのためのアプローチはありますか?異なるパッケージに 2 つのアクティビティを作成し、インテントからインターフェイスとして 1 つのアクティビティをロードすることはできますか? 何か案は?

4

4 に答える 4

2

複数のプラットフォームをターゲットにするには、プロジェクトのビルド時に最小 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());
    }
 }

ダウンレベルのプラットフォームで機能を再実装するつもりはないので、ヘルパー クラス パターンはあまり役に立ちません。

于 2013-01-11T14:33:54.760 に答える
1

また、サポートライブラリを使用する場合はどうなりますか?

http://developer.android.com/training/basics/fragments/support-lib.html

どのような機能が必要ですか?

于 2013-01-11T13:06:37.907 に答える
1

あなたが求めていることは、Android Developers Official blog で非常に詳細に説明されています。

http://android-developers.blogspot.co.uk/2010/07/how-to-have-your-cupcake-and-eat-it-too.html

これは基本的に Java Lazy loading を適用しています。これは、Java が最初に呼び出されたときにのみクラスをロードするという事実を利用するプログラミング パターンです。

于 2013-01-11T13:48:39.377 に答える
0

答えてくれてありがとう..Eclipseで@装飾を使用してこの問題を解決できました:@SuppressLint( "NewApi")。

私の親アクティビティでは、VERSION と NFC のサポートを確認し、this.supportNFC; に書き込みました。その後、ロードするインテントを選択します

if(this.supportNFC == KITAPP.NFC_ENABLED){
   intent = new Intent(this, ActivityNFC.class);
} else {
   intent = new Intent(this, ActivityBasic.class);
}
startActivityForResult(intent, 0);

ところで、

class ActivityNFC extends ActivityBasic{}

そのため、NFC の追加機能を使用して NFC クラスを拡張しました。ただし、モバイル デバイスが NFC をサポートしていないか、バージョンが低い場合は、基本的な機能が読み込まれます。

于 2013-01-23T17:11:12.867 に答える