我可以使用BroadcastReceiver的回调方法吗?

时间:2014-03-01 14:52:08

标签: android

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

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

有没有人知道是否可以从BroadcastReceiver创建一个回调方法来启动一个函数f.ex. updateTextViews();在活动中?

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

此致,Niels。

2 个答案:

答案 0 :(得分:2)

  

我已将BroadcastReceiver作为一个单独的类使其更简单

恕我直言,你让它变得更加复杂。

  

因此,我必须找到一种方法来告诉我的Activity类电池数据已更新,或者,这是我的解决方案,将对TextView字段的引用从Activity传递给BroadcastReceiver类。

选项#1:回到BroadcastReceiver使用内部类。 ACTION_BATTERY_CHANGED只能通过registerReceiver()使用。只需让onReceive()在活动上调用一些方法来完成更新UI的工作。

选项#2:将您的活动传递到BroadcastReceiver的构造函数中,并按照选项#1调用该方法。

选项#3:使用事件总线,如Square's Otto或greenrobot的EventBus。

答案 1 :(得分:1)

对我来说有用的是简单地将界面对象声明为静态。请记住,尽管静态可以导致尽可能多的问题,因为静态信息可以在实例中保持不变。

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

}