Molto più semplice:
@Override protected void onStop() { super.onStop(); // Unbind from the service if (mBound) { unbindService(mConnection); mBound = false; } }Praticamente l'unica cosa fondamentale è la riga:
unbindService(mConnection);Ovviamente, questo unbinding deve essere subordinato alla variabile di controllo mBound.
Anche sulla interfaccia mConnection abbiamo:
@Override public void onServiceDisconnected(ComponentName arg0) { mBound = false; }un semplice riportare a falso la variabile di controllo.
Però quel parametro non lo capisco: è qualcosa che deve essere meglio compreso.
Non credo che abbia molta importanza... semmai lo vedo dopo.
Ora mi esercito ancora a riscrivere tutti i codici.
Questo è il codice per il binding che ho scritto nel Service:
public class MioServizio extends Service{ IBinder mBinding=new LocalBinder(); @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return mBinding; } public class LocalBinder extends Binder{ MioServizio getService(){ return MioServizio.this; } } }
Adesso nell'attività che vi si binda:
public class MainActivity extends Activity { MioServizio servizio; boolean mBound; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void onStart(){ super.onStart(); Intent intent=new Intent(this,MioServizio.class); bindService(intent,mConnection,Context.BIND_AUTO_CREATE); } @Override public void onStop(){ super.onStop(); if(mBound){ unbindService(mConnection); mBound=false; } } ServiceConnection mConnection=new ServiceConnection(){ @Override public void onServiceConnected(ComponentName name, IBinder service) { LocalBinder mService=(LocalBinder)service; servizio=mService.getService(); mBound=true; } @Override public void onServiceDisconnected(ComponentName name) { mBound=false; } }; }Ecco. E ho verificato che funziona.
Ho posto dei markers nel Service per rendermi conto di come si comporta un service "bindato" rispetto a un'Activity che lo binda:
public class MioServizio extends Service{ IBinder mBinding=new LocalBinder(); @Override public void onCreate(){ Log.v("SERVICE","ONCREATE"); } @Override public int onStartCommand(Intent intent, int flags, int startUI){ Log.v("SERVICE","ONSTARTCOMMAND"); return Service.START_NOT_STICKY; } @Override public void onDestroy(){ super.onDestroy(); Log.v("SERVICE","ONDESTROY"); } @Override public IBinder onBind(Intent intent) { Log.v("SERVICE","BINDING"); return mBinding; } public class LocalBinder extends Binder{ MioServizio getService(){ return MioServizio.this; } } }L'Activity viene creata, quindi viene ridotta a "icona", e il Service segue le sue sorti.
07-02 10:57:24.939: V/SERVICE(11241): ONCREATE 07-02 10:57:24.939: V/SERVICE(11241): BINDING 07-02 10:57:25.029: I/Timeline(11241): Timeline: Activity_idle id: android.os.BinderProxy@41e991d8 time:1127969 07-02 10:57:31.796: E/OpenGLRenderer(11241): SFEffectCache:clear(), mSize = 0 07-02 10:57:31.806: V/SERVICE(11241): ONDESTROY
Niente a carico del metodo onStartCommand, che invece viene chiamato in causa quando il Service sia evocato tramite il comando startService.
Ottimo! Dunque da qui in poi, sarà opportuno che, quando si usa un Service, esso sia bindato piuttosto che startato, a meno che non si presuma che esegua qualcosa per i cavoli suoi senza che sia necessaria alcun'altra interazione fra esso e il resto dell'applicazione.
Nessun commento:
Posta un commento