android – 如何在没有onCreate()的情况下将数据从BroadcastReceiver传递给Activity
作者:互联网
我有一个关于将数据从BroadcastReceiver传递到Activity的严重问题.让我们仔细看看我的问题.我有一个类PhoneStateReceiver扩展BroadcastReceiver,用于接收传入的电话.
public class PhoneStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
try {
System.out.println("Receiver start");
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){
}
}
catch (Exception e){
e.printStackTrace();
}
}
}
传入的电话将被发送到名为ReceiverActivity的活动. ReceiverActivity接收传入的电话并通过套接字连接将其发送到服务器.套接字连接在onCreate函数中初始化.我用google搜索并找到服务器方式将数据从BroadcastReceiver传递给Activity.常见的方法是通过putExtra函数发送数据并调用startActivity.但是,该方法将再次调用onCreate然后连接套接字,再次绘制UI.因此,在我的情况下它没有帮助.
在我的目标中,如果手机接到来电,它会将来电发送到ReceiverActivity. ReceiverActivity接收消息并调用send函数.这是最好的方法吗?谢谢
将数据从BroadcastReceiver传递到我使用的ReceiverActivity的常用方法如下
在PhoneStateReceiver类中:
Intent intent_phonenum = new Intent(context, ReceiverActivity.class);
intent_phonenum.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent_phonenum.putExtra("phone_num", incomingNumber);
context.startActivity(intent_phonenum);
在ReceiverActivity类中:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
connect_socket();
Intent intent = getIntent();
phone_num = intent.getStringExtra("phone_num");
send(phone_num);
}
解决方法:
您可以使用一种非常简单的设计模式来简化类之间的通信,并解耦您的代码:发布者/订阅者.我最喜欢的库是EventBus:
首先,添加到build.gradle文件:
compile 'org.greenrobot:eventbus:3.0.0'
然后,创建一个简单的POJO – Plain Old Java Object,如下所示:
public class OnReceiverEvent{
private String phoneNumber;
public OnReceiverEvent(String phone){
this.phoneNumber = phone;
}
public String getPhoneNumber(){
return phoneNumber;
}
}
接下来,通过使您的Receiver类成为发布者,并将您的Activity作为订阅者,您应该能够轻松地将信息传递给您的活动,如下所示:
//inside your PhoneStateReceiver class when you want to pass info
EventBus.getDefault().post(new OnReceiverEvent(phoneNumber));
接下来,在您的活动中,只需执行以下操作:
//onStart
@Override
public void onStart(){
super.onStart();
EventBus.getDefault().register(this);
}
//onStop
@Override
public void onStop(){
super.onStop();
EventBus.getDefault().unregister(this);
}
最后,处理发布的数据,即phoneNumber值:
@Subscribe
public void onPhoneNumberReceived(OnReceiverEvent event){
//get the phone number value here and do something with it
String phoneNumber = event.getPhoneNumber();
//display or something?
}
UPDATE
如果您希望此活动订阅另一个事件,只需使用@Subscribe注释创建一个类似于第一个的方法.
@Subscribe
public void onSomeOtherEvent(EventClassName event){
//get the variables here as usual;
}
这是将数据从接收器传递到活动的最简单方法,而不必担心一遍又一遍地启动活动!
我希望这个帮助能祝你好运!
标签:android,sockets,broadcastreceiver,android-broadcast 来源: https://codeday.me/bug/20190717/1487780.html