BroadcastReceiver の onReceive メソッドで TextView を変更したいのですが、アクティビティではないため、findViewById でアクセスできません。アクティビティで BroadcastReceiver のプライベート クラスを作成したくありません。
どうすればアクセスできますか?
BroadcastReceiver の onReceive メソッドで TextView を変更したいのですが、アクティビティではないため、findViewById でアクセスできません。アクティビティで BroadcastReceiver のプライベート クラスを作成したくありません。
どうすればアクセスできますか?
インターフェイスを定義し、コールバックを使用して、ブロードキャスト イベントが受信されたことをアクティビティに知らせます。
public Interface BroadcastReceiverListener {
void onReceive(int arg1, String arg2); ..<----add arguments you want to pass back
}
BroadcastReceiver クラスで
ArrayList<BroadcastReceiveListener > listeners = new ArrayList<BroadcastReceiveListener >();
...
public void addBroadcastReceiveListener (BroadcastReceiveListener listener){
if(!listeners.contains(listener)){
listeners.add(listener);
}
}
public void removeBroadcastReceiveListener (BroadcastReceiveListener listener){
if(listeners.contains(listener)){
listeners.remove(listener);
}
}
OnReceive で
for (BroadcastReceiveListener listener:listeners){
listener.onReceive(arg1, arg2);
}
アクティビティで:
public class MyActivity extends Activity implements BroadcastReceiveListener {
...
broadcastReceiver.addBroadcastReceiveListener(this); <---- the instance of your receiver
...
}
public void onReceive(int arg1, String arg2){
// do whatever you need to do
}
ノート。インターフェイスを使用するため、(アクティビティだけでなく) どのクラスでもインターフェイスを実装できるため、アプリ内のどこでも更新できます。BroadcastReceiver クラスは知らないか気にしません。リスナーが登録されている場合は、リスナーを呼び出すだけです。
これで、R にアクセスする必要も、UI に関係することも何も必要ありません。これは、Activity が UI を認識し、変更できる唯一のクラスであるためです。これが Android のやり方です。
[編集]
引数は、必要なものです。
Interface
を契約と考えてください。それを実装する人は誰でもメソッドを実装する必要がありonReceive()
、メソッドは整数と文字列で呼び出されると書かれています。必要な引数があれば、それはあなた次第です。
BroadcastReceiver.onReceive()
インターフェイスのコールバックを呼び出し、onReceive
int と String を引数として渡します。
たとえば、ブール値を渡すようにインターフェイス定義を変更できます。
public Interface BroadcastReceiverListener {
void onReceive(boolean arg1); ..<----add arguments you want to pass back
}
次に、呼び出し元は次のようになります。
for (BroadcastReceiveListener listener:listeners){
listener.onReceive(someBooleanValue);
}
コールバックは次のようになります。
public void onReceive(boolean theCallerIsReady){
if(theCallerIsReady){
// do interesting stuff
}
}