我有一个活动A,它有套接字通信,我打开活动B,点击按钮,意图来自活动A.
public void onClick(View v) {
//open preferences activity
intent = new Intent(MainActivity.this, PreferencesActivity.class);
//using some bundle here to send data
.....
MainActivity.this.startActivityForResult(intent, 1);
}
现在,如果在活动A中发生任何套接字通信,那么我必须在活动B中识别(活动A中发生了一些通信),并且需要关闭活动B并将活动A也带到前台。套接字通信如下。
ConnectSocket();
while (true) {
//wait for socket client
socClient = (SSLSocket) sslServerSocket.accept();
//once socket is connected send it back to activity
if (socClient != null) {
if (socketThread != null) {
connectedSocket = socClient;
socClient = null;
communicationThread = new ReadSocketThread();
communicationThread.start();
}
}
}
}
这里的ReadsocketThread()是一个读取套接字消息的线程。
如何通知活动B活动A中发生的事情。我尝试使用处理程序发送消息但不成功作为活动中的处理程序A从不向活动B发送消息。作为初学者,可能是我没有正确使用。 / p>
答案 0 :(得分:0)
解决方法是在Android中使用EventBus
。使用EventBus
:
compile 'org.greenrobot:eventbus:3.0.0'
然后,创建一个事件以接收来自活动A的消息
public class HelloWorldEvent {
private final String message;
public HelloWorldEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
然后从活动A:
创建发件人EventBus.getDefault().post(new HelloWorldEvent("Hello EventBus!”);
然后,您可以根据需要添加任意数量的侦听器,如在您的情况下,在活动B中添加:
@Subscribe
public void onEvent(HelloWorldEvent event){
// your implementation
Toast.makeText(getActivity(), event.getMessage(), Toast.LENGTH_SHORT).show();
}
所以,这里发生的事情是,从活动A调用EventBus.getDefault().post(new HelloWorldEvent("Hello EventBus!”);
时,您在活动B中获得Toast,您可以在那里传递您的首选消息。关于EventBus
的更详细示例可用[here]
答案 1 :(得分:0)
我为我的场景找到了另一个简单的解决方案,因为我不需要在活动之间传递任何消息,而是在套接字通信上想要关闭活动B并将活动A带到前台。我只使用
打开活动B就可以在不使用任何广播或事件总线的情况下实现此目的 startActivityForResult(intent, somerequestcode);
当与活动A进行通信时,在适当的位置只需致电
finishActivity(somerequestcode);
注意:somerequestcode可以是任何整数