其他分享
首页 > 其他分享> > android – 如何在没有onCreate()的情况下将数据从BroadcastReceiver传递给Activity

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