我能否在BroadcastReceiver中使用回调方法?

6

学习在Android中使用BroadcastReceiver类,我编写了一个小程序来接收电池充电状态并将其写入活动中的三个TextView字段。

然而,我已经将BroadcastReceiver作为单独的类来使其更加简单和与活动分离。因此,我必须找到一种方法告诉我的Activity类电池数据已经更新,或者,这是我的解决方案,将TextView字段的引用从Activity传递给BroadcastReceiver类。

有没有人知道是否可以从BroadcastReceiver创建回调方法来启动函数,例如updateTextViews(); 在Activity中?

这是源代码-请注意有两个Java文件: http://pastebin.com/qjCTsSuH

谢谢,尼尔斯。

2个回答

5

我觉得对我很有帮助的方法就是将接口对象声明为静态的。但要记住,静态变量可能会引起一些问题,因为静态变量的值会在实例之间保留。

public class MainActivity extends AppCompatActivity implements SocketMessageReceiver.ISocketMessageReceiver {

    //Declare the cb interface static in your activity
    private static SocketMessageReceiver.ISocketMessageReceiver iSocketMessageReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        //Assign this
        iSocketMessageReceiver = this;
        socketMessageReceiver.registerCallback(iSocketMessageReceiver);
    }

    @Override
    public void sendSocketMessage(String socketMessage) {
        lblEchoMessage.setText(socketMessage);
    }

}

在你的接收器中....
public class SocketMessageReceiver extends BroadcastReceiver {

    interface ISocketMessageReceiver {
        void sendSocketMessage(String socketMessage);
    }

    //Also declare the interface in your BroadcastReceiver as static
    private static ISocketMessageReceiver iSocketMessageReceiver;

    @Override
    public void onReceive(Context context, Intent intent) {

        if(intent.getAction().equals("com.WarwickWestonWright.SocketExample.RECEIVE")) {
            iSocketMessageReceiver.sendSocketMessage(intent.getBundleExtra("DATA").getString("DATA"));
        }

    }

    public void registerCallback(ISocketMessageReceiver iSocketMessageReceiver) {
        this.iSocketMessageReceiver = iSocketMessageReceiver;
    }

}

这对我有用,但你错过的唯一一件事是在 MainActivity 类中声明 socketMessageReceiver 对象。 - AmJa

3
我将BroadcastReceiver作为一个单独的类,以使其更加简单。
在我看来,这样做反而使它更加复杂了。
因此,我必须找到一种方法来告诉我的Activity类电池数据已经更新,或者使用我的解决方案,从Activity传递TextView字段的引用到BroadcastReceiver类中。
选项1:只需返回使用BroadcastReceiver的内部类。ACTION_BATTERY_CHANGED只能通过registerReceiver()使用。只需在onReceive()中调用某个活动上的方法来更新UI。
选项2:将您的活动传递到BroadcastReceiver的构造函数中,并像选项1中那样调用该方法。
选项3:使用事件总线,如Square的Otto或greenrobot的EventBus。

谢谢。现在使用选项#2。 - skovmand
如果您在一个活动中有很多广播需要接收,那么最佳实践是在您的活动中只有一个广播接收器,并且有许多意图过滤器吗? - Micro
@MicroR:嗯,可能吧。抽象地回答这个问题很困难。 - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接