2017-01-18 3 views
0

У меня есть задание А, который имеет сокеты, и я открываю активность B по нажатию кнопки с целью от деятельности А.андроида деятельность в связи деятельности

 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, тогда я должен определить, что (какое-то сообщение произошло в деятельности A) в деятельности B, и необходимо закрыть активность 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. Как новичок, возможно, я не правильно использую.

+0

1> использовать локальный трансляционный менеджер. - регистрировать трансляцию в одной активности и отправлять трансляцию из другого вида деятельности. 2> использование связанный сервис. –

+0

спасибо за ответ .. я использовал localbroadcastmanager способен общаться ... хорошая ссылка с образцом кода находится здесь ... http://stackoverflow.com/questions/8802157/how-to-use-localbroadcastmanager –

+0

Хорошо , убедитесь, что вы не обновляете какой-либо пользовательский интерфейс после действия onstop системного обратного вызова –

ответ

0

Обходной подход заключается в использовании EventBus в Android. Для использования EventBus:

compile 'org.greenrobot:eventbus:3.0.0' 

Затем создайте событие, чтобы получить сообщение от Activity A

public class HelloWorldEvent { 
    private final String message; 

    public HelloWorldEvent(String message) { 
     this.message = message; 
    } 

    public String getMessage() { 
     return message; 
    } 
} 

Затем создайте отправителя из Activity 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(); 
} 

Итак, что происходит здесь, когда возникает EventBus.getDefault().post(new HelloWorldEvent("Hello EventBus!”); из Activity A, вы получите Toast в действии B, вы можете передать свое предпочтительное сообщение там. Более подробный пример можно найти на EventBus[here]

0

Я нашел еще одно простое решение для моего сценария, поскольку мне не нужно передавать какое-либо сообщение между действиями, вместо этого на сокетной связи хочется закрыть активность B и довести активность A до области. Я достиг этого без использования какой-либо трансляции или автобуса событий, просто открыв активность B с

startActivityForResult(intent, somerequestcode); 

и когда есть связь с деятельностью А, в соответствующем положении просто вызовите

finishActivity(somerequestcode); 

примечание: somerequestcode может любое целое число

Смежные вопросы