Jam*_*ame 3 sockets android broadcastreceiver android-broadcast
我有一个关于将数据传递BroadcastReceiver
给a的严重问题Activity
.让我们仔细看看我的问题.我有一个PhoneStateReceiver extends 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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
来电将被发送到Activity
,被叫ReceiverActivity
.在ReceiverActivity
接收来电,并通过套接字连接发送到服务器.套接字连接在onCreate
函数中初始化.我用谷歌搜索并找到服务器方式将数据传递BroadcastReceiver
给Activity
.常见的方法是通过putExtra
函数和调用发送数据startActivity
.但是,该方法将onCreate
再次调用然后连接套接字,再次绘制UI.因此,在我的情况下它没有帮助.
在我的目标中,如果手机接到来电,它会将来电发送给ReceiverActivity
.该ReceiverActivity
接收消息并调用发送功能.这是最好的方法吗?谢谢
将数据从a传递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);
Run Code Online (Sandbox Code Playgroud)
在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);
}
Run Code Online (Sandbox Code Playgroud)
简单,没有任何第三方库.
确保BroadcastReceiver
必须注册并取消注册OnPause()
.
你必须做两件事
在您的活动中注册接收器,如下所示.
public class MainActivity extends Activity {
Context context;
BroadcastReceiver updateUIReciver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this;
IntentFilter filter = new IntentFilter();
filter.addAction("service.to.activity.transfer");
updateUIReciver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//UI update here
if (intent != null)
Toast.makeText(context, intent.getStringExtra("number").toString(), Toast.LENGTH_LONG).show();
}
};
registerReceiver(updateUIReciver, filter);
}
}
Run Code Online (Sandbox Code Playgroud)
现在为您服务
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)) {
Intent local = new Intent();
local.setAction("service.to.activity.transfer");
local.putExtra("number", incomingNumber);
context.sendBroadcast(local);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在此处使用一个非常简单的设计模式来简化类之间的通信并解耦代码:publisher/subscriber
。我最喜欢的库是EventBus
:
首先,添加到您的build.gradle文件中:
compile 'org.greenrobot:eventbus:3.0.0'
Run Code Online (Sandbox Code Playgroud)
然后,创建一个POJO - Plain Old Java Object
像这样的简单的:
public class OnReceiverEvent{
private String phoneNumber;
public OnReceiverEvent(String phone){
this.phoneNumber = phone;
}
public String getPhoneNumber(){
return phoneNumber;
}
}
Run Code Online (Sandbox Code Playgroud)
接下来,通过创建您的Receiver
类 apublisher
和Activity
a subscriber
,您应该能够轻松地将信息传递给您的活动,如下所示:
//inside your PhoneStateReceiver class when you want to pass info
EventBus.getDefault().post(new OnReceiverEvent(phoneNumber));
Run Code Online (Sandbox Code Playgroud)
接下来,在您的活动中,只需执行以下操作:
//onStart
@Override
public void onStart(){
super.onStart();
EventBus.getDefault().register(this);
}
//onStop
@Override
public void onStop(){
super.onStop();
EventBus.getDefault().unregister(this);
}
Run Code Online (Sandbox Code Playgroud)
最后,处理发布的数据,即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?
}
Run Code Online (Sandbox Code Playgroud)
更新
如果您希望此活动订阅另一个事件@Subscribe
,只需使用注释创建一个方法,就像在第一个事件中所做的那样。
@Subscribe
public void onSomeOtherEvent(EventClassName event){
//get the variables here as usual;
}
Run Code Online (Sandbox Code Playgroud)
这是将数据从接收器传递到您的活动的最简单方法,而不必担心一遍又一遍地启动活动!
我希望这个帮助能祝你好运!