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

sko*_*and 5 android

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

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

有谁知道是否可以从 BroadcastReceiver 中创建一个回调方法来启动一个函数,f.ex。更新文本视图();在活动中?

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

问候,尼尔斯。

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

}
Run Code Online (Sandbox Code Playgroud)

在你的接收器中......

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

}
Run Code Online (Sandbox Code Playgroud)


Com*_*are 3

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

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

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

选项#1:只需返回到使用BroadcastReceiver. ACTION_BATTERY_CHANGED无论如何只能通过使用registerReceiver()。只需onReceive()调用 Activity 上的一些方法即可完成更新 UI 的工作。

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

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