|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Oct 2010
Messaggi: 78
|
[android] Chiarimento sugli INTENT
Salve
stavo provando a utilizzare nel manifest la modalità: Codice:
android:launchMode="singleInstance" Codice:
Intent myIntent = newIntent(activityB.this,activityC.class);
myIntent.putExtra("firstKeyName","FirstKeyValue");
myIntent.putExtra("secondKeyName","SecondKeyValue");
startActivity(myIntent);
Codice:
protected void onNewIntent (Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
Log.i(TAG, "onNewIntent");
processExtraData();
}
__________________
Trattative concluse con: oldfield, fabioBS |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
In quest'ottica la funzione degli intent viene sminuita, in realtà essi hanno uno scopo più elevato, ovvero quello di fornire un meccanismo di comunicazione interprocesso. "onNewIntent" è l'event handler del ricevente che viene invocato a fronte di una richiesta da parte di un'altra activity, o di un'altra applicazione, o del sistema operativo. Il parametro intent descrive l'azione richiesta dal chiamante; la chiamata a setIntent serve per aggiornare l'intent dell'activity in cui ti trovi, è necessaria solo se il comportamento dell'activity deve essere influenzato dall'intent che l'ha chiamata (nel tuo caso è superflua). Se ti interessa sapere cosa contiene l'intent nel tuo caso, puoi mettere un breakpoint ed analizzare la variabile.
Qui trovi la descrizione ufficiale. |
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Oct 2010
Messaggi: 78
|
Quote:
Un'ultima cosa mi potresti fare degli esempi di casi d'usi in cui è preferibile usare startActivityForResult() rispetto al startActivity()
__________________
Trattative concluse con: oldfield, fabioBS |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
startActivityForResult viene utilizzato quando si vuole ottenere una risposta dall'activity richiamata. Supponiamo ad esempio che tu voglia realizzare un'applicazione che necessita di scattare delle foto, ma non vuoi "reinventare la ruota" scrivendo tutte le funzioni necessarie per gestire la fotocamera (white balance, zoom, flash mode, ecc..), piuttosto preferisci appoggiarti all'applicazione di sistema già predisposta a tale scopo. Per fare ciò occorre avviare l'applicazione (activity) della fotocamera, comunicandole che si desidera ricevere una foto (intent).
Nella tua activity avrai una cosa del genere (ho omesso il controllo degli errori per brevità): Codice:
void scattaFoto() {
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 13);
}
public void onActivityResult(int requestID, int res, Intent data) {
super.onActivityResult(requestID, res, data);
if (requestID == 13) {
Bitmap picture = (Bitmap) data.getExtras().get("data");
// Fai qualcosa con l'immagine ottenuta
}
}
Riporto dalla doc ufficiale un passo molto significativo: Quote:
|
|
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Oct 2010
Messaggi: 78
|
capisco, ultima domanda e non ti disturbo più
se ho per esempio un' activityA che riceve i dati sia dall'activityB sia dall'activityC come faccio a scegliere un determinato comportamento in base all'activity chiamante. Cioè mi spiego meglio l'activityB mi passa i dati B e l'activityC mi passa i dati C, come faccio nell'activityA a capire chi l'ha chiamata ed estrarre i dati corrispondenti. questo modo può andare bene o esiste altro? grazie
__________________
Trattative concluse con: oldfield, fabioBS Ultima modifica di abbobba : 13-08-2015 alle 13:04. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
L'activity non deve sapere chi la sta chiamando, deve solo rispondere al comportamento richiesto (vedi paragrafo successivo). Puoi specificare il comportamento come extra all'interno dell'intent e recuperarlo dal metodo onNewIntent.
Fai attenzione alla launch mode, in determinate condizioni è possibile che la stessa istanza dell'activity riceva più intent, in questi casi è necessario implementare una politica di gestione. In ogni caso l'activity dovrebbe rispondere ad un unico tipo di richiesta (comportamento), e tali richieste dovrebbero differenziarsi solo in base a delle opzioni. Tipi di richieste diverse dovrebbero essere gestite da activity diverse; per esempio, l'activity "ScattaFoto" dovrebbe avere in input sempre e solo i parametri necessari per scattare una foto, mentre eventuali opzioni per aprire la galleria delle foto scattate dovrebbe aspettarsele un'activity "Galleria". Se le opzioni che vuoi passare all'activity sono variabili (pur facendo riferimento alla stessa azione) hai varie alternative, a titolo esemplificativo e non esaustivo riporto le seguenti: 1) passare un extra fisso che descrive il tipo di opzioni presenti; 2) passare un oggetto di una determinata classe che possiede tutte le opzioni con i valori di default, sovrascrivendo solo quelle che vuoi personalizzare. 3) passare un oggetto di classe variabile, ed utilizzare l'istruzione instanceof per determinare a quale classe appartiene. |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Oct 2010
Messaggi: 78
|
grazie mille
__________________
Trattative concluse con: oldfield, fabioBS |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:12.




















