コンストラクターで C2DM 送信者の電子メールを初期化する C2DM 受信者クラスがあります。問題は、リソース文字列から送信者の電子メールを取得する必要があるため、受信者のコンストラクターでコンテキストを取得する必要があることです。
受信機はこんな感じ
public class C2DMReceiver extends C2DMBaseReceiver {
public C2DMReceiver() {
super(AppConstants.getC2DMSender(this)); // How do I get the context here?
}
@Override
public void onRegistered(Context context, String registrationId)
throws java.io.IOException { ...
C2DMBaseReceiver の関連コード
public abstract class C2DMBaseReceiver extends IntentService {
...
private final String senderId;
/**
* The C2DMReceiver class must create a no-arg constructor and pass the
* sender id to be used for registration.
*/
public C2DMBaseReceiver(String senderId) {
// senderId is used as base name for threads, etc.
super(senderId);
this.senderId = senderId;
}
...
質問とはあまり関係ありませんが、バックグラウンドでこれが必要な理由は、コードが多くの Android プロジェクトで使用されているライブラリ プロジェクトにあり、それぞれがリソース ファイルで定義された独自の送信者の電子メール アドレスを持っているためです。AppConstants クラスには、さまざまなリソース文字列を読み取る仕事があり、前の質問 (ここAndroid、Best way to provide app specific constants in a library project?)に対する私の受け入れられた回答に続きます。
最後に、完全を期すために AppConstants.getC2DMSender メソッドは次のようになります。
public static String getC2DMSender(Context c){
return c.getResources().getString(uk.co.the_prize_quiz.quiz_template.R.string.c2dm_sender);
}
このライブラリを使用する特定のアプリには、xml リソースで c2dm_sender 変数を設定する責任があります。したがって、この変数を取得するには、コンテキストが必要です
<item type="string" name="c2dm_sender" format="string">app_specific_registered_c2dm@email_address</item>
これはリソース文字列で設定されるため、特定のアプリがこの値を設定でき、テンプレートはそれを自動的に使用します。