Per prima cosa, devo costruirmi sempre una struttura "ciclica" del tipo che ho ideato io: Un'attività iniziale chiama un Service che inizia il conto del tempo, quindi questo chiama un'altra attività il cui feedback reinnesca il controllo del tempo.
Il Service va bindato ad ambedue le attività.
Iniziamo con la ricostruzione di questa struttura.
public class TimerService extends Service{ Intent intent; PendingIntent pendingIntent; AlarmManager alarmManager; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } } }Non ricordo dove istanziavo AlarmManager e tutto il resto.
Credo ci fosse un metodo dedicato.
Vado a confrontarmi...
Sì, c'era un metodo dedicato StartTime().
Vado... Prima però devo definire l' "obiettivo" del Service, ossia l'attività che va chiamata dal timer.
Vado...
E adesso facciamo il binding della prima attività con il Service:
Codice di TimerService:
public class TimerService extends Service{ Intent intent; PendingIntent pendingIntent; AlarmManager alarmManager; IBinder mBinder=new LocalBinder(); @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return mBinder; } public class LocalBinder extends Binder{ TimerService getService(){ return TimerService.this; } } }
Codice di MainActivity:
public class MainActivity extends Activity { TimerService mService; boolean mBound; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } @Override public void onStart(){ super.onStart(); Intent intent=new Intent(this,TimerService.class); bindService(intent,mConnection,Context.BIND_AUTO_CREATE); } @Override public void onStop(){ super.onStop(); unbindService(mConnection); mBound=false; } private ServiceConnection mConnection=new ServiceConnection(){ @Override public void onServiceConnected(ComponentName name, IBinder service) { LocalBinder bnd=(LocalBinder)service; mService=bnd.getService(); mBound=true; } @Override public void onServiceDisconnected(ComponentName name) { mBound=false; } }; }Spero di non aver dimenticato niente.
Posso provare a mettere delle "spie" e verificare che il Service si avvii all'avvio dell'attività e si distrugga alla distruzione dell'attività...
@Override public void onCreate(){ super.onCreate(); Log.d("SERVIZIO", "CREATO"); } ...... @Override public void onDestroy(){ super.onDestroy(); Log.d("SERVIZIO", "DISTRUTTO"); }
07-20 11:43:31.606: D/SERVIZIO(25035): CREATO 07-20 11:43:31.876: I/Timeline(25035): Timeline: Activity_idle id: android.os.BinderProxy@42404380 time:140729091 07-20 11:43:52.436: E/OpenGLRenderer(25035): SFEffectCache:clear(), mSize = 0 07-20 11:43:52.436: D/SERVIZIO(25035): DISTRUTTOOk!
Ora procedo al bindaggio dell'altra attività chiamata Form.
public class Form extends Activity { TimerService mService; boolean mBound=false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_form); } @Override public void onStart(){ super.onStart(); Intent intent=new Intent(this,TimerService.class); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); } @Override public void onStop(){ super.onStop(); unbindService(mConnection); mBound=false; } private ServiceConnection mConnection=new ServiceConnection(){ @Override public void onServiceConnected(ComponentName name, IBinder service) { LocalBinder bnd=(LocalBinder)service; mService=bnd.getService(); mBound=true; } @Override public void onServiceDisconnected(ComponentName name) { mBound=false; } }; }Andiamo sulla fiducia, che verificare anche questa poi diventa troppo indaginoso...
Ora devo inserire un AlarmManager nel TimerService.
public void StartTime(){ intent=new Intent(getApplicationContext(),Form.class); pendingIntent=PendingIntent.getActivity(getApplicationContext(), 0, intent, 0); alarmManager=(AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+10*1000, pendingIntent); }Questo codice non lo ricordo, insieme all'altro per disattivare un alarmManager esistente.
Bisogna che lo ripassi bene.
Nessun commento:
Posta un commento