0

だから、これは多かれ少なかれ私の最後の質問の続きです最後の投稿へのリンク

私はコードに取り組んでおり、私の仲間が Notifiction.Builder を使用することを提案したので、それを理解しました。私または他の誰かがステータス通知「クロス API」を作成する方法を考えています。これが意味することは、Builder は API 11 以降で動作しますが、それ以下のものは使用できないということです。この問題に対する既知の回避策/修正はありますか? または、この問題の 2 つの異なるバージョンをコーディングする必要がありますか?

4

2 に答える 2

2

非推奨のメソッドを使用して複数の API サポートを実現する方法は多数ありますが、最も頻繁に言及されるのはリフレクションです。個人的には、クラスローダーを利用して通知の問題を解決しました。通知の作成に必要なさまざまなデータを処理するための基本的なラッパー メソッドを使用して、基本抽象クラスを作成しました。次のようになります。

public abstract class NotificationWrapper {

public NotificationWrapper(Context context) {

}

public abstract void createNotification(int resid, CharSequence ticker);

public abstract void setTitle(CharSequence title);

public abstract void setText(CharSequence text);

public abstract void setIntent(PendingIntent intent);

public abstract void setFlags(int... flags);

public abstract void setDefaults(int defaults);

public abstract Notification getNotification();
}

もちろん、通知をどれだけカスタマイズしているかに応じて、メソッドを追加および削除できます。次に、これを 3 つの個別のクラスに拡張できます。1 つは API <11 用、もう 1 つは API >=11 用、もう 1 つは Jelly Bean 以降用です。各クラスでは、これらのメソッド呼び出しを現在の API バージョンで使用可能な適切なメソッドにリレーするだけです (つまり、11 より前のリレーは Notification メソッドに、11 より後のリレーは Notification.Builder メソッドに、Jelly Bean は 11 より後のものと同じですが、例外は次の点を除きます)。 getNotification() ではなく build() を使用します)。次に、通知を作成するときが来たら、SDK バージョンの条件とポリモーフィズムの美しさを使用して、適切なサブクラスをロードし、そのラッパー メソッドを使用して通知を作成します。

NotificationWrapper wrapper = null;
int ver = VERSION.SDK_INT;
if (ver >= 16) {
    wrapper = new NotificationWrapJB(context);
} else if (ver >= 11) {
    wrapper = new NotificationWrapHC(context);
} else {
    wrapper = new NotificationWrapPreHC(context);
}
wrapper.createNotification(resId, tickerText);
//etc....

繰り返しますが、これはこの問題に対処する多くの方法の 1 つにすぎませんが、より整理されているように感じられるので気に入っています。

さまざまな SDK バージョンで使用するメソッドに慣れていない場合は、NotificationおよびNotification.Builderに関する Android ドキュメントをお読みください。

于 2012-07-18T01:14:25.637 に答える
1

Support LibraryにあるNotificationCompatを探していると思います。また、Jelly Bean に付属する最新の通知を探している場合は、Jake Wharton (ActionBarSherlock を作成したもの) のNotificationCompat2を使用できます。

于 2012-07-18T08:21:37.310 に答える