2011-10-04 13 views
7

Sto provando a creare un progetto Android che contiene codice condiviso che verrà utilizzato da altri. In questo progetto ho solo POJO e nessuna classe specifica per Android.onActivityResult al di fuori di un ambito di attività

Alcune delle funzionalità richiedono la chiamata di alcune attività e dipendono dal risultato. Le mie classi POJO ricevono riferimenti all'attività di chiamata quando vengono utilizzate, ma ciò accade in fase di esecuzione e non ho alcun controllo sull'implementazione di tali attività.

Il mio problema è che con il riferimento dell'attività di chiamata posso startSubActivity ma non ho modo di aggiungere il onActivityResult, che potrebbe esiste nell'attività chiamata, ma non è a conoscenza del requestCode che ho usato.

La mia domanda è quindi come faccio a sapere, all'interno di un normale oggetto java quando l'attività è tornata? poiché, per quanto ho capito, posso implementare solo onActivityResult nelle classi di attività.

grazie!

risposta

0

La mia domanda è quindi come faccio a sapere, all'interno di un normale oggetto java quando l'attività è tornata?

Fare in modo che l'attività chiami il POJO, fornendo il risultato.

Le mie classi POJO fanno riferimento all'attività di chiamata quando vengono utilizzate, ma ciò accade in fase di esecuzione e non ho alcun controllo sull'implementazione di tali attività.

Quindi chiunque sia in "controllo sull'esecuzione di tali attività" dovrà fare in modo che l'attività chiami il POJO, fornendo il risultato. Questo non è diverso da qualsiasi altro meccanismo di callback/listener.

+0

Beh, ho alcuni vincoli brutte che ho bisogno di trattare con .. che cosa mai usa il mio POJO è come una scatola nera per me , so solo che invoca metodi sui miei POJO e, in cambio, aspetto un risultato. Per quanto riguarda le attività che desidero chiamare dal mio POJO, quelle sono attività esistenti nel dispositivo Android, anch'esse fuori dal mio controllo. Devo solo chiamarle (diciamo ottenere un contatto) e ottenere il risultato . grazie. –

+0

@Nitzan Tomer: "Ho dei brutti vincoli che devo affrontare" - questi vincoli dovranno essere risolti. Non puoi usare 'startActivityForResult()' tranne che per alcune tue attività in cui implementi 'onActivityResult()'. – CommonsWare

1

Avrete non pochi problemi con questa configurazione, ma questo è come si potrebbe desiderare di iniziare:

Si dovrà includere un'attività nel progetto che non fa altro che iniziare l'attività che si desidera per ottenere il risultato e memorizzarlo in uno spazio di archiviazione accessibile a livello globale (ad es. un singleton o un campo statico).

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(); 
    } 
} 

Ci sono un paio di problemi, però. Come il metodo POJO non può essere chiamato dal thread principale (UI), perché è necessario convertire una chiamata asincrona (startActivityForResult()) a una sincrona (Pojo.m()) e l'attività che si desidera ricevere informazioni da verrà avviato sul thread principale, quindi non è possibile bloccarlo in Pojo.m() ...

In ogni caso, il codice non funziona, ma è possibile vedere quale strada da percorrere se si deve davvero attaccare con questa configurazione. Ma dovresti davvero cercare di trovare altri mezzi per recuperare i dati, come un fornitore di contenuti.

0

Forse PendingIntent http://developer.android.com/reference/android/app/PendingIntent.html può aiutarti in questo. Sto ancora cercando una soluzione al mio problema e per me questa classe sembra abbastanza promettente.

Un altro modo potrebbe essere quello di creare il proprio estratto di classe e di avere un metodo onActivityResult che deve essere sovrascritto.Naturalmente, dovresti fare affidamento su JavaDoc e "si prega di chiamare super.onActivityResult" per poter elaborare il risultato nel codice. Ma se gli utenti della tua classe vogliono avere un certo successo con il tuo codice dovrebbero seguire le tue istruzioni JavaDoc.

1

Ho lo stesso problema mentre gioco con UNITY3D, l'unità ha la sua attività (il giocatore dell'unità), non voglio modificarlo per qualche motivo. ma l'attività del giocatore non fa nulla all'interno della funzione "onActivityResult". E ho qualcosa da fare quando accedo al raccoglitore di immagini, posso chiamare "unityPlayer.startActivityForResult" per aprire il selettore di immagini, ma NON È POSSIBILE CODIFICARE IL MIO PROPRIO "onActivityResult".

Penso che quello che ci auguriamo è qualcosa di simile:

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

+0

Utilizzare i blocchi di codice per formattare meglio il codice – gareththegeek

Problemi correlati