2011-10-04 7 views
7

Estoy tratando de crear un proyecto de Android que contenga código compartido que será utilizado por otros. En este proyecto, solo tengo POJO y no hay clases específicas de Android.onActivityResult fuera de un ámbito de actividad

Algunas de las funciones requieren llamar a algunas actividades y dependen del resultado. Mis clases de POJO hacen referencia a la actividad de llamada cuando se usan, pero eso sucede en tiempo de ejecución y no tengo control sobre la implementación de esas actividades.

Mi problema es que con la referencia de la actividad de llamadas que puedo startActivityForResult pero no tengo manera de añadir el onActivityResult, lo que podría existe en la actividad de llamadas, pero no es consciente de la requestCode he usado.

Mi pregunta es, entonces, ¿cómo puedo saber, desde dentro de un objeto java normal cuando la actividad ha regresado? dado que, por lo que entiendo, solo puedo implementar en el resultado de actividad en las clases de actividad.

gracias!

Respuesta

0

Mi pregunta es, entonces, ¿cómo puedo saber, desde dentro de un objeto java normal cuando la actividad ha regresado?

Haga que la actividad llame al POJO, proporcionando el resultado.

Mis clases POJO hacen referencia a la actividad de llamada cuando se usan, pero eso está sucediendo en tiempo de ejecución y no tengo control sobre la implementación de esas actividades.

Luego, quien esté en "control sobre la implementación de esas actividades" necesitará que la actividad llame al POJO, proporcionando el resultado. Esto no es diferente de cualquier otro mecanismo de devolución de llamada/oyente.

+0

Bueno, tengo algunas limitaciones desagradables que necesito para hacer frente a lo que cada vez utiliza .. mi POJO es como una caja de negro para mí , todo lo que sé es que invoca métodos en mis POJO y, a cambio, espero un resultado. En cuanto a las actividades a las que quiero llamar desde mi POJO, esas son actividades existentes en el dispositivo Android, que también están fuera de mi control. Solo necesito llamarlas (digamos obtener un contacto) y obtener el resultado . gracias. –

+0

@Nitzan Tomer: "Tengo algunas limitaciones desagradables con las que tengo que lidiar": habrá que eliminar esas restricciones. No puede usar 'startActivityForResult()' excepto de alguna actividad suya donde implementa 'onActivityResult()'. – CommonsWare

1

Usted tendrá bastantes problemas con esta configuración, pero esto es cómo es posible que desee para empezar:

Usted tendrá que incluir una actividad en su proyecto, que no hace nada más que comenzar la actividad que desea para obtener el resultado y almacenarlo en un almacenamiento accesible a nivel mundial (por ejemplo, un singleton o un campo estático).

class Pojo { 
    static final ConditionVariable gate = new ConditionVariable(); 
    static int result; 

    int m(Context context) { 
     context.startActivity(new Intent(context, ForwarderActivity.class)); 
     gate.block(); 
     return result; 
    } 
} 

class ForwarderActivity extends Activity { 
    private boolean started = false; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (!started) { 
      started = true; 
      startActivityForResult(new Intent("ContactsProvider"), 1); 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     Pojo.result = resultCode; 
     Pojo.gate.open(); 
    } 
} 

Aunque hay un par de problemas. Al igual que el método de su POJO, no se puede invocar desde el hilo principal (UI), ya que necesita convertir una llamada asincrónica (startActivityForResult()) en una síncrona (Pojo.m()) y la actividad de la que desea recibir información se iniciará en el hilo principal, por lo que no puede bloquearlo en Pojo.m() ...

De todos modos, el código no funciona, pero se puede ver qué camino tomar si realmente tiene que pegarse con esta configuración Pero realmente deberías intentar encontrar otros medios para obtener los datos, como un proveedor de contenido.

0

Quizás PendingIntent http://developer.android.com/reference/android/app/PendingIntent.html puede ayudarlo con eso. Todavía estoy buscando una solución a mi problema y para mí, esta clase parece bastante prometedora.

Otra forma podría ser hacer su propio resumen de clase y tener un método onActivityResult que se debe sobrescribir.Por supuesto, deberá confiar en JavaDoc y "llamar a super.onActivityResult" para poder procesar el resultado en su código. Pero si los usuarios de su clase quieren tener algún éxito con su código, deben seguir sus instrucciones JavaDoc.

1

tengo el mismo problema mientras juego con UNITY3D, la unidad tiene su propia actividad (el jugador de la unidad), no quiero editarlo por alguna razón. pero la actividad del jugador no hace nada dentro de la función "onActivityResult". Y tengo algo que hacer cuando tengo acceso al selector de imágenes, puedo llamar "unityPlayer.startActivityForResult" para abrir el selector de imágenes, pero NO HAY CÓMO CODIFICAR MI PROPIO "onActivityResult".

Creo que lo que esperamos es algo como esto:

OtherActivityClass.onActivityResultListener=function(){My Own CODE}..........OR OtherActivityClass.onActivityResultListener.add(myResultListener)..................

+0

Utilice bloques de código para formatear mejor su código – gareththegeek

Cuestiones relacionadas