Comunicación de Android entre Actividades sin onActivityResult

En una aplicación en la que estoy trabajando, estoy enfrentando un problema con respecto a la comunicación entre las actividades.
Básicamente tengo un UI-Component, que es similar a un Combobox . Sin embargo, la lista de valores posibles para este componente tiene que ser openend en una nueva Activity .
Así que cuando haces clic en el componente, se abre una nueva Activity , usando startActivityForResult .
Cuando selecciona el nuevo valor, se coloca dentro de un Bundle y se devuelve a la Activity anterior. Luego necesito usar el método onActivityResult para obtener el valor seleccionado y establecerlo en el componente.
Esto significa que cada Activity que utiliza este componente necesita anular onActivityResult y actualizar el componente con el nuevo valor.
Lo que quiero es que el componente se ocupe de todas estas cosas y sólo tiene que registrar un Listener , al igual que lo hace para un TextView y componentes similares.
Pero por el momento no puedo encontrar una buena manera de hacerlo, ya que la comunicación está estrechamente vinculada a la Activity y no puedo obtener el resultado de la Activity fuera del onActivityResult .
¿Alguien sabe una buena solución para este problema?

¿Qué pasa con BroadCastReceiver ?

Básicamente, usted envía una emisión y cada actividad que está registrada para recibir esa transmisión recibirá que la emisión recibirá el mensaje en onReceive

En primer lugar declarar en el manifiesto lo que vas a escuchar, algo así como:

  <receiver android:name=".TestBroadCast”> <intent-filter> <action android:name="io.test.TEST"/> </intent-filter> </receiver> 

Que simplemente ampliar BroadCastReceiver

 public class TestBroadCastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //TODO: Handle the Intent received. } 

Ejemplo de cómo enviar una emisión:

  public static final String INTENT_ACTION = "io.test.TEST"; public static final String INTENT_EXTRA = "someData"; Intent intent = new Intent(); intent.setAction(INTENT_ACTION); intent.putExtra(INTENT_EXTRA,"test"); sendBroadcast(intent); 

Y obtendrá la Intención y que usted puede manejarlo como desee :)!

UPDATE ~ Registro de código en lugar de manifiesto

Para evitar registrar el servicio desde el Manifiesto, puede hacerlo desde el código, con un código similar al siguiente listado:

 IntentFilter intentFilter = new IntentFilter("io.test.TEST"); TestBroadCastReceiver mReceiver = new TestBroadCastReceiver(); context.registerReceiver(mReceiver, intentFilter); 

PS Te sugiero que utilices LocalBroadcastReceiver si no necesitas otras aplicaciones para poder enviar resultados insted de BroadcastReceiver por razones de seguridad

Solución para esto: utilice EventBus y EventBus evento pegajoso en él. Al hacerlo, no tiene que anular onActivityResult .

El flujo de trabajo será el siguiente: – Crear objeto de evento con sus datos – Eliminar todos los eventos pegajosos del mismo tipo del Bus – publicar nuevos valores mediante el método .sendSticky() .

Ese evento estará alrededor hasta que algo lo quite del autobús – comience otra actividad – en este método de sustitución de actividad, suscribiéndose a ese tipo de evento, en él: a) tome y procese el acontecimiento con su argumento b) quite del autobús – suscriba Al bus (segunda Actividad) en el método onResume() – cancelar la suscripción del bus en el método .onPause()

El punto es que esto le permite manejar sin problemas el ciclo de vida de la segunda actividad y puede suscribirse o anular la suscripción al bus en la clase base

Puede implementar Observer Design Pattern, la mejor implementación de que son BroadcastReceiver y una Biblioteca que implementan el diseño de bus de eventos Otto

Hola @Alex Shutov tenía razón Intente esto https://github.com/greenrobot/EventBus http://greenrobot.org/eventbus/

Use EventBus aquí es el enlace https://github.com/greenrobot/EventBus sólo 3 pasos y sí es 3rd PartyLibrary. Su luz muy no debe afectar el tamaño de la aplicación, así

En general, para este escenario, mantendré los datos en la actividad principal como datos estáticos y los usaré y los actualizaré en otras actividades.

Por ejemplo, puede declarar y rellenar estas 2 variables en Actividad principal (es decir, MainActivity)

public static ArrayList arrayList ;

public static SparseBooleanArray sparseBooleanArray ;

Ahora todas las demás actividades al poblar los valores de lista, pueden rellenar desde la lista de matrices utilizando el nombre MainActivity.arrayList. Cuando el usuario selecciona o deselecciona un valor, slo sparseBooleanArray se actualizará con un valor booleano.

Mientras se poblan valores por primera vez en arrayList y sparseBooleanArray, asegúrese de usar el mismo índice para que estén sincronizados

arrayList.add(1,"List Item 1") ;

sparseBooleanArray.put(1,false ) ; // represent selected value for List Item 1

En caso de que tenga plan para utilizar esta funcionalidad para múltiples actividades, arraylist se mantendrá igual, sin embargo, habrá un SparseBooleanArray para cada actividad para almacenar los valores seleccionados en función de la actividad.

  • Android GeoCoder: la búsqueda por código postal devuelve resultados inesperados
  • No se puede obtener la respuesta de OkHttp.body.toString () para devolver una cadena
  • Solución automática de laberinto
  • Comunicación entre la base de datos SQL Server 2008 y la aplicación para Android
  • Retrofit - Cliente Okhttp Cómo almacenar en caché la respuesta
  • File.list () devuelve los archivos en un orden diferente para 4.0 que 2.2
  • Implementación parcelable con ArrayList <objeto personalizado>
  • Cómo eliminar el ". 0" en un número entero cuando se utiliza doble en java?
  • NetWork Sobre el hilo principal Excepción
  • Cómo instanciar un oyente por reflexión en Android
  • Android crop ImageView dentro del padre RelativeLayout
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.