Ripercorriamo il percorso delle SharedPreferences nella mia app...
Si apre MainActivity.
In onStart si
avvia e si binda il Service:
public void onStart() {
super.onStart();
Intent intent = new Intent(this, TimerService.class);
startService(intent);
bindService(intent, mConnection, Service.BIND_AUTO_CREATE);
}
Il Service, una volta attivo, crea SharedPreferences:
public class TimerService extends Service {
SharedPreferences SP;
public TextToSpeech tts;
OnAlarmChangeListener onAlarmChangeListener;
boolean alarmOn;
Handler handler=new Handler();
IBinder mBinder=new LocalBinder();
@Override
public void onCreate(){
Intent intent=new Intent(this,MainActivity.class);
PendingIntent pi=PendingIntent.getActivity(this, 0, intent, 0);
Notification notification=new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.cornetta)
.setContentTitle("CoachCall")
.setContentText("Telefonate dal Coach")
.setContentIntent(pi).build();
startForeground(1,notification);
SP=getApplicationContext().getSharedPreferences("settings", Context.MODE_PRIVATE);
SharedPreferences.Editor editor= SP.edit();
editor.putInt("intervalloMin", 10);
editor.putInt("intervalloMax", 10);
editor.commit();
Qui viene direttamente impostato intervalloMin e intervalloMax.
Quindi in startTime, ossia quando già onCreate è stato chiamato, si usano intervalloMin e intervalloMax:
public void startTime(){
int intervalloMin=SP.getInt("intervalloMin", 0);
int intervalloMax=SP.getInt("intervalloMax", 0);
int delta=intervalloMax-intervalloMin;
Random rnd=new Random();
int differenza=(intervalloMax==intervalloMin)? 0 : rnd.nextInt(delta);
int intervallo=intervalloMin+differenza;
Runnable runnable=new Runnable(){
@Override
public void run() {
Intent intent =new Intent(getApplicationContext(),Telefono.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
startActivity(intent);
}
};
handler.postDelayed(runnable, intervallo*1000);
alarmOn=true;
if(onAlarmChangeListener!=null)onAlarmChangeListener.AlarmChange();
}
Quando si apre l'activity Impostazioni degli Intervalli, ecco il codice:
SP=getApplicationContext().getSharedPreferences("settings",Context.MODE_PRIVATE);
seekBar1=(SeekBar)findViewById(R.id.seekBar1);
seekBar2=(SeekBar)findViewById(R.id.seekBar2);
textView1=(TextView)findViewById(R.id.textView1);
textView2=(TextView)findViewById(R.id.textView2);
//codice che setta le seekBars in relazione ai valori letti nelle impostazioni
seekBar1.setMax(230);
intervalloMin=SP.getInt("intervalloMin", 10);
setTextViewFromSeekBar(intervalloMin,textView1);
seekBar1.setProgress(intervalloMin-10);
seekBar2.setMax(230);
intervalloMax=SP.getInt("intervalloMax", 10);
setTextViewFromSeekBar(intervalloMax,textView2);
seekBar2.setProgress(intervalloMax-10);
All'atto della regolazione degli intervalli, il valore che viene preso in caso di settings non inizializzati è 10.
In base a questo vengono compilati le TextView con i valori e le seekBars, la cui posizione viene settata a 10 in meno, in modo che per un valore di 10 vengano settate effettivamente a 0.
Il punto centrale è quello dell'utilizzo dei settings nella funzione setTime di TimerService.
Un codice come questo
SharedPreferences.Editor editor= SP.edit();
editor.putInt("intervalloMin", 10);
editor.putInt("intervalloMax", 10);
editor.commit();
seguito da questo che preleva i dati per l'utilizzo effettivo in startTime
public void startTime(){
int intervalloMin=SP.getInt("intervalloMin", 0);
int intervalloMax=SP.getInt("intervalloMax", 0);
int delta=intervalloMax-intervalloMin;
Random rnd=new Random();
int differenza=(intervalloMax==intervalloMin)? 0 : rnd.nextInt(delta);
int intervallo=intervalloMin+differenza;
Runnable runnable=new Runnable(){
@Override
public void run() {
Intent intent =new Intent(getApplicationContext(),Telefono.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
startActivity(intent);
}
};
non ha senso: meglio togliere l'impostazione iniziale e prendere direttamente come 10 il valore in startTime se il setting non è inizializzato.
Ossia, il primo diventa:
SP=getApplicationContext().getSharedPreferences("settings", Context.MODE_PRIVATE);
mentre in startTime:
public void startTime(){
int intervalloMin=SP.getInt("intervalloMin", 10);
int intervalloMax=SP.getInt("intervalloMax", 10);
int delta=intervalloMax-intervalloMin;
Random rnd=new Random();
....
Quindi quando andremo a regolare gli intervalli, lasciando tutto inalterato...
seekBar1.setMax(230);
intervalloMin=SP.getInt("intervalloMin", 10);
setTextViewFromSeekBar(intervalloMin,textView1);
seekBar1.setProgress(intervalloMin-10);
seekBar2.setMax(230);
intervalloMax=SP.getInt("intervalloMax", 10);
setTextViewFromSeekBar(intervalloMax,textView2);
seekBar2.setProgress(intervalloMax-10);
in caso di non inizializzazione dei settings, l'intervallo preso per buono sarà 10, che andrà messo pari pari nelle TextView mentre seekBars saranno settate al valore -10, ossia a zero.
Una volta che invece con le seekBars sarà settato un valore diverso, questo sarà quello utilizzato in startTime del Service, e quello letto dai settings nel form per la regolazione degli intervalli, sempre settando le seekBars al valore sottratto di 10.