Autore Topic: Comunicazione tra activity e service  (Letto 3689 volte)

Offline Der_Suchende

  • Nuovo arrivato
  • *
  • Post: 4
  • Il 90% dei problemi del tuo PC è seduto davanti
  • Respect: 0
    • Google+
    • Giovanni Capuano
    • Mostra profilo
    • Gianni Capuano Web Development
  • Dispositivo Android:
    Huawei U8160
  • Sistema operativo:
    Mac OS X 10.7
Comunicazione tra activity e service
« il: 14 Settembre 2012, 00:17:53 CEST »
0
Ciao a tutti, mi sono iscritto dal poco al forum, da qualche ora sono alle prese con un problema che purtroppo non riesco a risolvere, ho cercato davvero tanto ma purtroppo non sono riuscito a capire come risolvere.
Vorrei far comunicare un service con una activity, la tecnica che sto utilizzando è tramite gli intent, creo un intent nel service e mando tramite putExtra i dati all'activity.

Nel service ho gestito l'invio dei dati tramite l'override del metodo onStartCommand
Codice service
Codice (Java): [Seleziona]
@Override
        public int onStartCommand(Intent intent, int flags, int startId) {
                // Solo per debugging
                Log.i(LOG_TAG, "Service Started");
                // Inizializziamo il numero di notifiche inviate
                String attivita = intent.getStringExtra("activity");

                if(attivita.equals("InterventiActivity")){
                        final Intent intentListaInterventi = new Intent(this, InterventiActivity.class);
       
                         intentListaInterventi.putExtra("nInterventi", nInterventi);

                 for(int i=0;i<nInterventi;i++){
                 intentListaInterventi.putExtra("cognomePaz", interv[i].getCognomePaz());
                 intentListaInterventi.putExtra("ora", interv[i].getOra());
                 }}else if(attivita.equals("Intervento_specificoActivity")){
                       
                        InterventoSpecifico.start();
                }
                               
                       
                return super.onStartCommand(intent, flags, startId);
        }

Nell'activity ho creato un Intent che mandasse in esecuzione il service
Codice Activity
Codice (Java): [Seleziona]
 @Override
          public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                setContentView(R.layout.interventi);
           
               
                serviceIntent = new Intent(this,MyLocalService.class);
                startService(serviceIntent);
                serviceIntent.putExtra("activity", "InterventiActivity");
                Intent riconoscimento = new Intent(this, MyLocalService.class);

               Bundle extra = getIntent().getExtras();
                 
                 nInterventi = extra.getInt("nInterventi");
                arrayData = new String[nInterventi];
               
                for(int i=0;i<nInterventi;i++)
                         arrayData[i] = extra.getString("cognome") + "ore: "+extra.getString("ora") ;
               
                ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,arrayData);
                setListAdapter(arrayAdapter);
          }

Mi viene sollevata una eccezione del tipo NullPointerException perché il metodo get dall'activity per ricevere i dati dal service non riceve nulla, questo è il LogCat:
09-13 22:21:56.579: E/AndroidRuntime(20568):    at adysis.main.InterventiActivity.onCreate(InterventiActivity.java:40)
dove la riga 40 è
Codice: [Seleziona]
                 nInterventi = extra.getInt("nInterventi");
dell'activity.

Se questo non è il modo giusto di procedere, vorrei sapere qual'è, per poter creare una comunicazione efficace tra service ed activity.
Grazie a tutti.
« Ultima modifica: 14 Settembre 2012, 00:19:30 CEST da Der_Suchende »

Offline Phate

  • Utente junior
  • **
  • Post: 123
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy S
  • Sistema operativo:
    Windows 7
Re:Comunicazione tra activity e service
« Risposta #1 il: 14 Settembre 2012, 12:54:30 CEST »
0
Diciamo che in linea generale il service dovrebbe comunicare il meno possibile con le activities, e per la comunicazione con l'utente esistono le notification o i toasts.

Se il tuo è il caso classico, quello in cui il service scarica delle info via internet e l'activity le visualizza, ti consiglierei di crearti un db sqllite: il service inserisce le info nel db e, tramite ad esempio cursor loaders, l'activity le visualizza al momento giusto.

Offline Der_Suchende

  • Nuovo arrivato
  • *
  • Post: 4
  • Il 90% dei problemi del tuo PC è seduto davanti
  • Respect: 0
    • Google+
    • Giovanni Capuano
    • Mostra profilo
    • Gianni Capuano Web Development
  • Dispositivo Android:
    Huawei U8160
  • Sistema operativo:
    Mac OS X 10.7
Re:Comunicazione tra activity e service
« Risposta #2 il: 14 Settembre 2012, 16:45:43 CEST »
0
Ti spiego brevemente, vorrei usare il service per mandare dei dati che prendo da un file in SD card (fare quindi il caricamento una sola volta), però a questo punto se devo attivare database e altra roba, preferisco creare un oggetto static pubblico della prima activity che viene condiviso con tutte le altre classi e che quindi può essere utilizzato quando voglio. Che ne pensi?

Offline Phate

  • Utente junior
  • **
  • Post: 123
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy S
  • Sistema operativo:
    Windows 7
Re:Comunicazione tra activity e service
« Risposta #3 il: 14 Settembre 2012, 17:13:43 CEST »
0
Allora se ho capito bene ti serve la comunicazione activity --> service, non service-->activity giusto?

Offline agenio

  • Utente junior
  • **
  • Post: 77
  • Respect: +11
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Sistema operativo:
    Windows 8.1
Re:Comunicazione tra activity e service
« Risposta #4 il: 14 Settembre 2012, 17:18:35 CEST »
0

Offline Phate

  • Utente junior
  • **
  • Post: 123
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy S
  • Sistema operativo:
    Windows 7
Re:Comunicazione tra activity e service
« Risposta #5 il: 14 Settembre 2012, 18:39:45 CEST »
0
Si, se la direzione è activity-->service devi farti un service remoto (col binder per intenderci).
Però se il tuo problema è solo inviare dei files in modo asincrono per non far freezare la ui io ti direi di andare con un semplice thread o asynctask, molto più semplice e leggero...il service si usa per altri problemi!

Nella sezione tutorials/services e threads trovi un tutorial per entrambe le tecniche
« Ultima modifica: 14 Settembre 2012, 18:42:32 CEST da Phate »

Offline Der_Suchende

  • Nuovo arrivato
  • *
  • Post: 4
  • Il 90% dei problemi del tuo PC è seduto davanti
  • Respect: 0
    • Google+
    • Giovanni Capuano
    • Mostra profilo
    • Gianni Capuano Web Development
  • Dispositivo Android:
    Huawei U8160
  • Sistema operativo:
    Mac OS X 10.7
Re:Comunicazione tra activity e service
« Risposta #6 il: 14 Settembre 2012, 18:44:47 CEST »
0
Quindi mi consigli l'asynctask o thread... mmmh a questo punto se mi dici che è anche più leggero e semplice da implementare procedo in questo senso. Grazie mille per l'aiuto :D

Offline Phate

  • Utente junior
  • **
  • Post: 123
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy S
  • Sistema operativo:
    Windows 7
Re:Comunicazione tra activity e service
« Risposta #7 il: 14 Settembre 2012, 19:12:54 CEST »
0
Se devi solo fare quello si, decisamente...e poi il tutorial relativo è contrassegnato come [facile], che vuoi di più? :D

Diciamo che potresti usare sia thread che asynctask, l'unica differenza è che con l'async task puoi anche dare un feedback all'utente della riuscita/fallimento dell'operazione, col thread invece non puoi generare Toasts o in generale interagire con la gui (potresti ma è più complesso).

In generale per questo cose io uso asynctask visto che mi piace fare uscire almeno un toast "caricamento completato" alla fine.
« Ultima modifica: 14 Settembre 2012, 19:15:15 CEST da Phate »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
R: Comunicazione tra activity e service
« Risposta #8 il: 14 Settembre 2012, 19:19:04 CEST »
+1
Senza scomodare database, loaders, binders e altri:

https://github.com/greenrobot/EventBus

Inviato dal mio Galaxy Nexus con Tapatalk 2

Offline gsources75

  • Utente normale
  • ***
  • Post: 327
  • Respect: +9
    • Google+
    • pepigno75
    • devandroid_it
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus S - Vodafone Smart -BB Bold- Iphone 4-
  • Play Store ID:
    Giuseppe+Sorce
  • Sistema operativo:
    Ubuntu-Windows Seven- Mac Lion
Re:Comunicazione tra activity e service
« Risposta #9 il: 25 Settembre 2012, 17:34:39 CEST »
0
LI sto provando gli EventBus ma non mi vanno.

Ricky tu li hai provati

Faccio il register nell' activity e il post in un AsyncTask ma non mi funge.
La domanda stupida è quella che non si fa

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Comunicazione tra activity e service
« Risposta #10 il: 25 Settembre 2012, 20:48:24 CEST »
0
Se ti può interessare ho creato un piccolo esempio:

https://github.com/rciovati/EventBus

Offline gsources75

  • Utente normale
  • ***
  • Post: 327
  • Respect: +9
    • Google+
    • pepigno75
    • devandroid_it
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus S - Vodafone Smart -BB Bold- Iphone 4-
  • Play Store ID:
    Giuseppe+Sorce
  • Sistema operativo:
    Ubuntu-Windows Seven- Mac Lion
R: Comunicazione tra activity e service
« Risposta #11 il: 25 Settembre 2012, 21:11:28 CEST »
0
Si grazie. Ormai penso di usare i remote service ma è interessante vedere qualche esempio.

Inviato dal mio Galaxy Nexus con Tapatalk 2
La domanda stupida è quella che non si fa

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Comunicazione tra activity e service
« Risposta #12 il: 25 Settembre 2012, 21:28:39 CEST »
0
Si grazie. Ormai penso di usare i remote service ma è interessante vedere qualche esempio.

Beh sono due cose abbastanza diverse... vedi tu ;)

Offline gsources75

  • Utente normale
  • ***
  • Post: 327
  • Respect: +9
    • Google+
    • pepigno75
    • devandroid_it
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus S - Vodafone Smart -BB Bold- Iphone 4-
  • Play Store ID:
    Giuseppe+Sorce
  • Sistema operativo:
    Ubuntu-Windows Seven- Mac Lion
Re:Comunicazione tra activity e service
« Risposta #13 il: 25 Settembre 2012, 21:31:54 CEST »
0
Si lo so che sono diverse. Forse li uso tutti e due.
L' app è collegata ad un dispositivo BT quindi con il service otterrei entrambe le cose, gestione BT in background e la gestione diciamo degli eventi.

L' errore che facevo nella mia implementazione degli EventBus è che creavo un' instanza, tu hai utilizzato il singleton
La domanda stupida è quella che non si fa

Offline Phate

  • Utente junior
  • **
  • Post: 123
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy S
  • Sistema operativo:
    Windows 7
Re:Comunicazione tra activity e service
« Risposta #14 il: 25 Settembre 2012, 22:45:03 CEST »
0
Ma lasciate stare ste cose...siete su android, programmate alla maniera android!
Posta il codice dell'async task e qualcuno ti aiuterà