android - 从 BroadcastReceiver 访问 R

标签 android textview broadcastreceiver

我想在 BroadcastReceiver 的 onReceive 方法中更改 TextView,但我无法使用 findViewById 访问它,因为它不是 Activity 。 我不想在我的 Activity 中为 BroadcastReceiver 创建私有(private)类。

我怎样才能获得访问权限?

最佳答案

定义一个接口(interface)并使用回调让 Activity 知道已收到广播事件。

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

在您的 Activity 中:

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
}

注意。因为您使用接口(interface),所以任何类(不仅仅是 Activity)都可以实现它,因此您可以在应用程序的任何位置进行更新。 BroadcastReceiver 类不知道也不关心。它只会调用监听器(如果已注册)。

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

[编辑]

参数是您需要的任何内容。

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

BroadcastReceiver.onReceive()调用接口(interface)的onReceive回调函数,传入int和String作为参数。

例如,您可以更改接口(interface)定义以传递 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
   }
}

关于android - 从 BroadcastReceiver 访问 R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15029647/

相关文章:

java - 无法在 BroadcastReceiver 中实例化接收器

android - 如何更改开关小部件的高度?

android - 如果从最近的 Activity android 中删除应用程序,则会清除 SharedPreferences

android - 使用不同密度设备android自动调整textView的大小

android - setText 无法在 TextView 中将数字显示为文本

android - 开机后如何使用broadcastreceivers自动启动服务?

android - 如何在应用程序中连接android market?

java - 使用 openweathermap api 的日期和时间

android - 在 Textview 中突出显示特定单词

android - 仅向特定 Activity 发送广播