从BroadcastReceiver访问R.

时间:2013-02-22 17:12:35

标签: android textview broadcastreceiver

我想在BroadcastReceiver的onReceive方法中更改TextView,但我无法使用findViewById访问它,因为它不是一个活动。 我不想在我的活动中为BroadcastReceiver创建一个私有类。

我如何获得访问权限?

1 个答案:

答案 0 :(得分: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
}

请注意。因为您使用的是界面,所以任何类(不仅仅是一个Activity)都可以实现它,以便您可以在应用中的任何位置进行更新。 BroadcastReceiver类不知道或不关心。它只是调用监听器,如果有人注册的话。

现在,您不需要访问R或任何与UI有关的内容,因为您的Activity是唯一知道并且可以更改您的UI的类 - 这是Android方式!

[编辑]

争论是你需要的。

Interface视为合约。它表示实现它的任何人都必须实现onReceive()方法,并且将使用整数和字符串调用该方法。这取决于你需要什么参数,如果有的话。

BroadcastReceiver.onReceive()调用接口的onReceive回调,并将int和String作为参数传递。

您可以更改接口定义以传递bool,例如。

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
   }
}