学习在Android中使用BroadcastReceiver类,我编写了一个小程序来接收电池充电状态并将其写入活动中的三个TextView字段。
但是,我已将BroadcastReceiver作为一个单独的类,使其更简单,并与活动分开。因此,我必须找到一种方法来告诉我的Activity类电池数据已经更新,或者,这是我的解决方案,将Activity的TextView字段的引用传递给BroadcastReceiver类。
有没有人知道是否可以从BroadcastReceiver创建一个回调方法来启动一个函数f.ex. updateTextViews();在活动中?
这是源代码 - 注意有两个java文件: http://pastebin.com/qjCTsSuH
此致,Niels。
答案 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;
}
}