Scrivo l'interfaccia, la variabile e il setter.
public interface OnAlarmChangeListener {
public void AlarmChange();
}
OnAlarmChangeListener onAlarmChangeListener;
public void setOnAlarmChangeListener(OnAlarmChangeListener listener){
onAlarmChangeListener=listener;
}
Quindi devo impostare una variabile booleana per il Service che dica se l'alarm è on o off:
boolean alarmOn;...e devo vedere dove questa variabile cambia, in modo da piazzarci un innesco dell'evento AlarmChange:
in startTime:
public void startTime(){
Runnable runnable=new Runnable(){
@Override
public void run() {
Intent intent =new Intent(getApplicationContext(),Telefono.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
};
handler.postDelayed(runnable, 7000);
alarmOn=true;
if(onAlarmChangeListener!=null)onAlarmChangeListener.AlarmChange();
in stopTime:
public void stopTime(){
handler.removeCallbacksAndMessages(null);
alarmOn=false;
if(onAlarmChangeListener!=null)onAlarmChangeListener.AlarmChange();
}
Oltre a notificare lo stato dell'Alarm quando questo cambia, è il caso di notificarlo quando si setta il listener.Per questo modifico il setter:
public void setOnAlarmChangeListener(OnAlarmChangeListener listener){
onAlarmChangeListener=listener;
onAlarmChangeListener.AlarmChange();
}
Ora vado a gestire l'evento in MainActivity:
@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() {
// TODO Auto-generated method stub
}
});
E ora si imposta l'aspetto di MainActivity a seconda che l'alarm sia on o off.
Quel circoletto rosso l'ho chiamato in xml "semaforo" e serve a indicare visivamente se l'alarm è attivo o no.Lo istanzio...
View semaforo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
semaforo=(View)findViewById(R.id.semaforo);
mService.setOnAlarmChangeListener(new OnAlarmChangeListener(){
@Override
public void AlarmChange() {
if(mService.alarmOn){
semaforo.setBackgroundResource(R.drawable.tondinoverde);
}
else {
semaforo.setBackgroundResource(R.drawable.tondinorosso);
}
}
});
Ma oltre al semaforo mi interessa anche attivare e disattivare i pulsanti a seconda che siano utili o inutili, disattivando il tasto "Attiva" se l'alarm è attivato, e il tasto "Disattiva" se l'alarm è disattivato:
mService.setOnAlarmChangeListener(new OnAlarmChangeListener(){
@Override
public void AlarmChange() {
if(mService.alarmOn){
semaforo.setBackgroundResource(R.drawable.tondinoverde);
bttAttiva.setEnabled(false);
bttDisattiva.setEnabled(true);
}
else {
semaforo.setBackgroundResource(R.drawable.tondinorosso);
bttAttiva.setEnabled(true);
bttDisattiva.setEnabled(false);
}
}
});
E proviamo...Funziona!
Una cosa importante è che il TimerService si disattivi qualora venga chiusa l'applicazione.
Per fare in modo che allo swipe dalla finestra delle app recenti si elimini tutto c'è questo metodo nel Service:
@Override
public void onTaskRemoved(Intent rootIntent){
stopSelf();
}
Sperimentiamola.Sì, okay.
E ho scoperto anche un'altra cosa fondamentale: che se non inserisco startService quando apro il service, questo non è foreground, in quanto sparisce con la sparizione delle activities..
Ecco la correzione in onStart di MainActivity:
@Override
public void onStart(){
super.onStart();
Intent intent=new Intent(this,TimerService.class);
startService(intent);
bindService(intent,mConnection,Service.BIND_AUTO_CREATE);
}
Nessun commento:
Posta un commento