Autore Topic: Activity e BroadcastReceiver... Intent?  (Letto 1876 volte)

Offline lo

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
Activity e BroadcastReceiver... Intent?
« il: 19 Settembre 2010, 20:00:22 CEST »
0
ciao a tutti,
sono costretto a rivolgermi a voi per un'aspetto che, fra documentazione e web, non sono riuscito a capire...

ho un'Activity (che fa partire un Service) e un BroadcastReceiver (che cattura risposte relative a richieste del Service);
necessito infine di aggiornare gli widget dell'Activity in base alla risposta catturata.

per prima cosa non sono riuscito a comprendere esattamente la differenza fra startService() e bindService().
inoltre non ho ben capito se devo propagare la risposta, dal BroadcastReceiver verso l'Activity, tramire un Intent o se è opportuno un meccanismo più complesso.

se dal BroadcastReceiver eseguo:
Codice (Java): [Seleziona]
Intent intent = new Intent(context, Main.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Bundle bundle = new Bundle();
bundle.putString("key", "data");
intent.putExtras(bundle);
context.startActivity(intent);
mi viene chiamato il metodo onCreate() dell'Activity (effetto probabilmente del flag FLAG_ACTIVITY_NEW_TASK)... ma non mi sembra molto corretto... :-P

grazie mille di eventuali suggerimenti!

Offline lo

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
Re:Activity e BroadcastReceiver... Intent?
« Risposta #1 il: 23 Settembre 2010, 19:59:36 CEST »
0
scusatemi è...

non capisco se posso aggiornare il testo di un elemento di una ListView direttamente dal BroadcastReceiver o se devo tornare all'Activity e farlo da lì.

gli argomenti che sto cercando sono:
. aggiornare uno widget/ListView/Activity da un BroadcastReceiver;
. trovare un elemento di una ListView creata dinamicamente;

basta solamente qualche suggerimento, per il momento mi sto un po' perdendo... :'(

grazie! :-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Activity e BroadcastReceiver... Intent?
« Risposta #2 il: 23 Settembre 2010, 23:44:59 CEST »
0
Codice (Java): [Seleziona]
aggiornare uno widget/ListView/Activity da un BroadcastReceiver;
Non vedo nessuna particolare difficoltà. Basta registrare il broadcast receiver direttamente dentro la tua activity tramite il metodo registerReceiver (e successivamente deregistrarlo). Puoi accedere direttamente ai componenti dell'activity e ai widget della View che contiene.

Codice (Java): [Seleziona]
trovare un elemento di una ListView creata dinamicamente;
Dipende un pochino da che tipo di adapter usi.
Se usi un ArrayAdapter si tratta semplicemente di fare una ricerca all'interno, ma senza ulteriori dettagli non saprei darti informazioni più precise

Offline lo

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
Re:Activity e BroadcastReceiver... Intent?
« Risposta #3 il: 24 Settembre 2010, 11:05:09 CEST »
0
ciao e grazie mille per l'intervento :)

Citazione
Basta registrare il broadcast receiver direttamente dentro la tua activity tramite il metodo registerReceiver

si, mi ero imbattuto nel metodo registerReceiver() ma credevo fosse solamente l'alternativa procedurale a quella dichiarativa del manifest.
mi sembra di capire che invece non è così...

è necessario sia dichiarare il BroadcastReceiver nel manifest, sia registrarlo nell'Activity?
la butto lì... il primo passo è necessario per "attivarlo" mentre il secondo per utilizzarlo?

Citazione
Se usi un ArrayAdapter si tratta semplicemente di fare una ricerca all'interno

ok, mi documenterò. ;-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Activity e BroadcastReceiver... Intent?
« Risposta #4 il: 24 Settembre 2010, 11:10:08 CEST »
0
Citazione
è necessario sia dichiarare il BroadcastReceiver nel manifest, sia registrarlo nell'Activity?
la butto lì... il primo passo è necessario per "attivarlo" mentre il secondo per utilizzarlo?

Nono anche registrandolo solo nel manifest è attivo :) Generalmente quando lo registri nel manifest il receiver ha "vita autonoma".
Registrarlo nelle activity è utile per casi come questo, quando una activity deve intercettare degli intent e deve reagire di conseguenza.

Offline lo

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
Re:Activity e BroadcastReceiver... Intent?
« Risposta #5 il: 24 Settembre 2010, 11:14:07 CEST »
0
a, ok.

quindi se, come nel mio caso, dal receiver devo aggiornare un elemento di una ListView devo istanziarlo "live" nel codice...

ma...:
. devo toglierlo dal manifest altrimento ho una doppia dichiarazione;
. deve rimanere anche lì altrimenti non viene visto;
. lasciarlo nel manifest o toglierlo è ininfluente.

scusami, è per capire :)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Activity e BroadcastReceiver... Intent?
« Risposta #6 il: 24 Settembre 2010, 11:29:45 CEST »
0
. devo toglierlo dal manifest altrimento ho una doppia dichiarazione;
. deve rimanere anche lì altrimenti non viene visto;
. lasciarlo nel manifest o toglierlo è ininfluente.

La prima :)


Offline lo

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
Re:Activity e BroadcastReceiver... Intent?
« Risposta #7 il: 24 Settembre 2010, 14:55:40 CEST »
0
rieccomi, una precisazione... :)

Citazione
Basta registrare il broadcast receiver direttamente dentro la tua activity tramite il metodo registerReceiver [...] Puoi accedere direttamente ai componenti dell'activity e ai widget della View che contiene.

per poter accedere agli elementi della ui, la classe receiver che dichiaro tramite registerReceiver() deve essere una inner class anonima dall'activity principale o può comunque stare in un file indipendente?
...sempre che aggiornare la ui dall'activity principale sia ok! o c'è una strada più corretta...

sto trovando un po' di tutto...
sto cercando di capire qual'è la strada concettualmente più corretta,

grazie ancora.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Activity e BroadcastReceiver... Intent?
« Risposta #8 il: 24 Settembre 2010, 15:01:10 CEST »
0
per poter accedere agli elementi della ui, la classe receiver che dichiaro tramite registerReceiver() deve essere una inner class anonima dall'activity principale o può comunque stare in un file indipendente?
...sempre che aggiornare la ui dall'activity principale sia ok! o c'è una strada più corretta...

Deve essere una innerclass in modo tale che abbia visibilità degli oggetti che rappresentano i widget a cui intendi accedere con le informazioni che provengono dal tuo service che lancia l'intent. A tal fine questi oggetti dovranno essere dichiarati come final ma non credo sia un problema.

Offline lo

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
Re:Activity e BroadcastReceiver... Intent?
« Risposta #9 il: 24 Settembre 2010, 15:22:04 CEST »
0
inner class, ok.
no perché, da una prima veloce ricerca, ho trovato anche soluzione diverse...

qui si ricorre ad un'interfaccia "listener".
qui invece si propone di utilizzare una terza classe "autonoma", activity o service che sia.

a senso credo che comunque l'aggiornamento della ui sia da delegare a chi la ui l'ha costruita.
io però non ho sufficiente esperienza per capire la via più corretta....

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Activity e BroadcastReceiver... Intent?
« Risposta #10 il: 24 Settembre 2010, 15:36:40 CEST »
0
La soluzione con interfaccia a mio avviso ha senso se devi andare a notificare la ricezione del messaggio a più activity contemporaneamente, così eviti di dover registrare un receiver in ognuna.
Tieni però in conto una cosa: se tu registri il receiver nell'activity se l'activity non è in esecuzione il receiver non riceve, se tu lo registri nel manifest e usi la soluzione tramite interfaccie il receiver è comunque in ascolto.

Comunque non mi sembra esista un design pattern per questa cosa, io ti ho suggerito come farei io :) Eventualmente se qualcun'altro vuole esprimersi in materia....

Offline lo

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
Re:Activity e BroadcastReceiver... Intent?
« Risposta #11 il: 25 Settembre 2010, 16:27:13 CEST »
0
Citazione
se tu lo registri nel manifest e usi la soluzione tramite interfaccie il receiver è comunque in ascolto.

eccoci. :)
sto cercando di implementare questo meccanismo in modo da avere il receiver sempre in ascolto e la possibilità di tornare dal receiver all'activity per aggiornare la ui.

credo che però mi manchi un passaggio: se il receiver lo dichiaro nel manifest, nel codice non ho l'istanza... con o senza interfaccia nel mezzo...
dove sbaglio?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Activity e BroadcastReceiver... Intent?
« Risposta #12 il: 26 Settembre 2010, 10:08:35 CEST »
0
Facciamo un breve riassunto dei possibili scenari la cui adozione dipende esclusivamente da quello che ti serve ottenere.

  • Receiver semplice  registrato nel manifest: Va bene se ti serve ad esempio intercettare l'intent che lanci dal server ed eventualmente avviare l'activity.
  • Receiver registrato nella tua activity: Va bene se ti serve andare a modificare la tua activity nel caso sia già in esecuzione.
  • Receiver registrato nel manifest più passaggio dell'activity al receiver: idem come sopra.

Detto questo non ho ben capito cosa ti serve fare. Se ti serve andare a modificare l'activity quando è in esecuzione e mostrare una notifica quando non lo è (secondo me non è corretto avviare applicazioni senza il consenso dell'utente) puoi fare in due modi:

  • Crei due receiver per lo stesso intent, uno lo registri nell'activity (assegnandogli priorità maggiore dell'altro) e l'altro lo registri nel manifest. Mandi poi un orderedBroadcast in modo che sia quello nell'activity che lo riceva prima. Se quest'ultima non è attiva l'intent raggiungerà l'altro receiver che mostrerà la notifica.
  • Crei un solo receiver e gli agganci l'activity con il metodo "interfaccia". Quando arriva l'intent vai a vedere se ci sono activity registrare e reagisci di conseguenza.

Spero di aver reso l'idea.

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Activity e BroadcastReceiver... Intent?
« Risposta #13 il: 26 Settembre 2010, 11:26:51 CEST »
0
(secondo me non è corretto avviare applicazioni senza il consenso dell'utente)
Aggiungo che oltre a non essere corretto, infrange pure le Guidelines della programmazione android. Una di queste infatti é "Do not interrupt user"
Postate il LogCat LogCat LogCat LogCat LogCat

Offline lo

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
Re:Activity e BroadcastReceiver... Intent?
« Risposta #14 il: 26 Settembre 2010, 16:40:09 CEST »
0
ragazzi, vi ringrazio davvero per la pazienza!
vorrei anche aggiungere che no, non è mia intenzione di adottare meccanismi invasivi per l'utente, "interrompendolo" o altro.

ricapitolando velocemente il mio progetto:
  • activity che mostra un report di eventi "myEvent";
  • receiver che cattura eventi "myEvent" e:
    • se l'activity è in esecuzione, aggiorna il report modificando la ui dell'activity ("metodo interfaccia"?)
    • se l'activity non è in esecuzione, aggiorna i dati in modo tale che quando l'applicazione viene eseguita trova il report aggiornato (credo che si possa giusto?)

da quanto mi sembra di capire devo quindi dichiarare il receiver nel manifest (per averlo sia sempre "attivo").
quindi due domandine al riguardo O:-)

Citazione
Receiver registrato nel manifest più passaggio dell'activity al receiver: idem come sopra.
cosa si intende più precisamente con "passaggio dell'activity al receiver"?
anche se, se ho capito bene, come nel punto 2, richiede che l'activity sia in esecuzione...

Citazione
Crei un solo receiver e gli agganci l'activity con il metodo "interfaccia". Quando arriva l'intent vai a vedere se ci sono activity registrare e reagisci di conseguenza.
questa mi sembra una soluzione interessante!
una cortesia... posso essere così sfacciato da chiederti un'accenno di codice per capire meglio il famigerato "metodo interfaccia"? :-P