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