Questo è il codice che nel mio progetto TimeManager gestisce la cancellazione dell'AlarmManager nel Service:
bttStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mService.StopTime();
if(mService.AlarmOn()){
textView.setTextColor(Color.GREEN);
textView.setText("ATTIVO");
}else{
textView.setTextColor(Color.RED);
textView.setText("INATTIVO");
}
}
});
Fa riferimento a due funzioni del Service: StopTime e AlarmOn.Vediamo...
StopTime:
public void StopTime(){
Log.e("CONTESTO STOP",getApplicationContext()+"");
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();
}
Se ricordo bene, ricrea esattamente le stesse classi di StartTime:
public void StartTime(){
Log.e("CONTESTO START",getApplicationContext()+"");
SharedPreferences SP=getApplicationContext().getSharedPreferences("tempi", Context.MODE_PRIVATE);
Intent intent=new Intent(getApplicationContext(),Form.class);
PendingIntent pendingIntent=PendingIntent.getActivity(getApplicationContext(),0,intent,0);
AlarmManager alarmManager=(AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
int base=(int) (SystemClock.elapsedRealtime()+(SP.getInt("ore",0)*60+SP.getInt("minuti", 0))*60*1000);
int range=(SP.getInt("rndOre",0)*60+SP.getInt("rndMinuti", 0))*60*1000;
Random rand=new Random();
int tempo=base-range+rand.nextInt(range*2+1);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, tempo, pendingIntent);
}
Confronto:
Intent intent=new Intent(getApplicationContext(),Form.class); PendingIntent pendingIntent=PendingIntent.getActivity(getApplicationContext(),0,intent,0); AlarmManager alarmManager=(AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE); Intent intent=new Intent(getApplicationContext(),Form.class); PendingIntent pendingIntent=PendingIntent.getActivity(getApplicationContext(),0,intent,0); AlarmManager alarmManager=(AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);Poi, mentre l'uno usa il metodo set, l'altro usa il metodo cancel.
Invece AlarmOn verifica se l'AlarmManager sia attivo...
Ecco, ho ricreato la triade:
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()+10*1000, pendingIntent);
}
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=null;
}
public boolean AlarmOn(){
Intent intent=new Intent(getApplicationContext(),Form.class);
boolean isAlarmOn=(PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_NO_CREATE)!=null);
return isAlarmOn;
}
Dunque, chiamando dalla MainActivity, il processo può essere attivato o deattivato, e si può avere il feedback se sia attivo o non attivo.Lo schema è sempre quello. Potrei impostare anche i tempi, sempre a partire dalla MainActivity.
Dovrei studiare un sistema migliore per l'impostazione dei tempi...
Comunque per il momento lasciamolo così.
Adesso imposto una semplice suoneria alla scadenza del tempo.
Nessun commento:
Posta un commento