Autore Topic: Interazione Service-Activity tramite Weakreference  (Letto 727 volte)

Offline theclash

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Linux Mint
Interazione Service-Activity tramite Weakreference
« il: 25 Agosto 2011, 20:38:02 CEST »
0
Ciao a tutti!
Come da titolo l'argomento è la possibilità di fare interagire un Service con una Activity tramite WeakReference.
Nello specifico si tratta di un Local Service S bindato ad un'activity A.
Ho cercato parecchio per capire il miglior metodo per far comunicare un Service con un Activity, e mi sono imbattuto nelle seguenti soluzioni:
- BroadcastReceiver
- PendingIntent
- Messenger
- Uso di AIDL

La mia preferenza era il BroadcastReceiver perchè mi era sembrato il piu facile da utilizzare.
Prima di cominciare a scrivere però mi sono posto la seguente domanda:

Se dalla mia Activity A faccio un bindService() di conseguenza setterò una connessione con un Binder che mi permetterà di richiamare direttamente dalla mia Activity i metodi del Service.

Mi sono quindi chiesto se passando il context dell'activity al Service, potessi avere lo stesso risultato al contrario, ovvero che il Service potesse chiamare metodi dell'Activity.

Tutto questo ha funzionato

Codice (Java): [Seleziona]
/* ServiceConnetion per il Bind del Service */
private ServiceConnection mConnection = new ServiceConnection() {
             
                public void onServiceConnected(ComponentName className, IBinder service) {
                 
                                mService = ((LocalBinder<MyService>) service).getService();

                                mService.faiqualcosa(ActivityContext); //chiama un metodo del Service
                }

                public void onServiceDisconnected(ComponentName className) {
                   
                        mService = null;
                }
            };


Codice (Java): [Seleziona]
public class LocalBinder<S> extends Binder {
    private  WeakReference<S> mService;
   
   
    public LocalBinder(S service){
        mService = new WeakReference<S>(service);
    }

   
    public S getService() {
        return mService.get();
    }
}
Codice (Java): [Seleziona]
/* metodo del service */
public void faiqualcosa(Context context) {
                WeakReference<Activity> mCallerActivity = new WeakReference<Activity>((Activity) context);
                MyActivity mainActivity = (MyActivity) mCallerActivity.get();
               
               
                mainActivity.faiqualcosaltro() //chiama un metodo dell'activity
        }

Questo di fatto genera un modo per comunicare tra una Activity ed un Service.
Ma siccome è una soluzione mia, e io programmo su Android solo da qualche mese mi stavo chiedendo se poteva andare bene.
Per questo vorrei chiedere un parere a chi ne sa piu di me, magari è una soluzione poco pulita, o pesante.
Qualcuno di voi ha mai adottato una soluzione del genere?
Insomma qualche parere non mi dispiacerebbe!
Grazie!
 
« Ultima modifica: 25 Agosto 2011, 20:44:14 CEST da theclash »