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): CHANGEDBene.
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