JavascriptProva

mercoledì 20 luglio 2016

Inizio del progetto Kouros. Binding e inizio del codice AlarmManager.

Diamo inizio al progetto Kouros.
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): DISTRUTTO
Ok!
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