1

BroadcastReceiver の onReceive メソッドで TextView を変更したいのですが、アクティビティではないため、findViewById でアクセスできません。アクティビティで BroadcastReceiver のプライベート クラスを作成したくありません。

どうすればアクセスできますか?

4

1 に答える 1

3

インターフェイスを定義し、コールバックを使用して、ブロードキャスト イベントが受信されたことをアクティビティに知らせます。

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()インターフェイスのコールバックを呼び出し、onReceiveint と 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
   }
}
于 2013-02-22T17:30:52.983 に答える