JavascriptProva

martedì 26 luglio 2016

Inserimento nell'applicazione del CustomEventListener sullo stato di AlarmManager

Ora si inserisce il CustomEvent.
Per cominciare, creo un'interfaccia in TimerService:
 public interface OnAlarmChangeListener{
  public void AlarmChange();
 }
Quindi creo una variabile in TimerService, di tipo OnAlarmChangeListener:
public class TimerService extends Service {

 IBinder mBinder=new LocalBinder();
 
 OnAlarmChangeListener mAlarmChangeListener;
 
 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return mBinder;
 }

......
e quindi nel corpo di TimerService creo il setter:
 public void setOnAlarmChangeListener(OnAlarmChangeListener onAlarmChangeListener){
  mAlarmChangeListener= onAlarmChangeListener;
 }
Questo dovrebbe consentirmi di inserire in Main il codice del setter: lo inserisco appena realizzata la connessione.

Main:
  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
   LocalBinder bnd=(LocalBinder)service;
   mService=bnd.getService();
   mBound=true;
   mService.setOnAlarmChangeListener(new OnAlarmChangeListener(){

    @Override
    public void AlarmChange() {
     Log.d("ALARM", "CHANGED");
     
    }
    
   });
   
  }
E vediamo se mi dà il giusto segnale...

Niente... ma io, nel corpo di TimerService, non ho dato da nessuna parte l'ordine di innescare l'evento AlarmChange()...
Lo faccio:
 public void StartTime(){
  Intent intent=new Intent(getApplicationContext(),
        Form.class);
  PendingIntent pendingIntent=PendingIntent.getActivity(getApplicationContext(), 
                0,
                intent, 
                0);
  AlarmManager alarmManager=(AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
  alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
      SystemClock.elapsedRealtime()+5*1000, 
      pendingIntent);
  mAlarmChangeListener.AlarmChange();
 }
 
 public void StopTime(){
  Intent intent=new Intent(getApplicationContext(),
    Form.class);
  PendingIntent pendingIntent=PendingIntent.getActivity(getApplicationContext(), 
            0,
            intent, 
            0);
  AlarmManager alarmManager=(AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
  alarmManager.cancel(pendingIntent);
  if(pendingIntent!=null)pendingIntent.cancel();
  mAlarmChangeListener.AlarmChange();
 }
...e rivediamo.

Funziona!
Ecco il LogCat:
07-27 06:26:55.876: D/ALARM(15540): CHANGED
07-27 06:27:00.711: D/ALARM(15540): CHANGED
07-27 06:27:02.332: D/ALARM(15540): CHANGED
07-27 06:27:03.994: D/ALARM(15540): CHANGED
Bene.
Adesso posso manovrare la mia piccola View chiamata "semaforo" che cambia colore a seconda del fatto che alarmManager sia settato o no.
Creo la variabile oggetto e la inizializzo:
 View semaforo;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  Log.d("MAIN", "ONCREATE");
  
  semaforo=(View)findViewById(R.id.semaforo);
E aggiusto il codice del setter:
  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
   LocalBinder bnd=(LocalBinder)service;
   mService=bnd.getService();
   mBound=true;
   mService.setOnAlarmChangeListener(new OnAlarmChangeListener(){

    @Override
    public void AlarmChange() {
     if(mService.AlarmOn()){
      semaforo.setBackgroundResource(R.drawable.tondinoverde);
     }else{
      semaforo.setBackgroundResource(R.drawable.tondinorosso);
     }
     
    }
    
   });
E vediamo...

Perfetto!
Aggiusto anche la disabilitazione dei pulsanti "Attiva" e "Disattiva".
  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
   LocalBinder bnd=(LocalBinder)service;
   mService=bnd.getService();
   mBound=true;
   mService.setOnAlarmChangeListener(new OnAlarmChangeListener(){

    @Override
    public void AlarmChange() {
     if(mService.AlarmOn()){
      semaforo.setBackgroundResource(R.drawable.tondinoverde);
      bttStart.setEnabled(false);
      bttStop.setEnabled(true);
     }else{
      semaforo.setBackgroundResource(R.drawable.tondinorosso);
      bttStart.setEnabled(true);
      bttStop.setEnabled(false);
     }
     
    }
    
   });
Proviamo...

Funziona, ma quando si apre il programma, o quando si riapre l'attività Main dopo che era stata chiusa, non viene messo in atto nessun comportamento adeguato allo stato di Alarm.
Metto nel TimerService il codice per l'innesco dell'evento AlarmChange direttamente nel setter.

TimerService:
 public void setOnAlarmChangeListener(OnAlarmChangeListener onAlarmChangeListener){
  mAlarmChangeListener= onAlarmChangeListener;
  mAlarmChangeListener.AlarmChange();
 }
E proviamo...

Funziona egregiamente!

Nessun commento:

Posta un commento