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
}

笔记。因为您使用接口,所以任何类(不仅仅是 Activity)都可以实现它,因此您可以在应用程序的任何位置进行更新。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
   }
}
于 2013-02-22T17:30:52.983 回答