Un'activity A ha un codice per chiamare un Service.
Intent intent = new Intent(this, response.class); // Add extras to the bundle intent.putExtra("foo", "bar"); // Start the service // startService(intent);Abbiamo dunque un Service che si chiama response, e lo startService relativo è "commentizzato" perché, dato che si deve creare un PendingIntent, non serve.
Andiamo avanti...
alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE); int i; i = 15; alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), i * 1000, pintent); Ecco infatti che viene creato il PendingIntent:
pintent = PendingIntent.getService(this, 0, intent, 0);E ora si crea l'AlarmManager:
alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE); int i i = 15; alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), i * 1000, pintent);Non capisco perché c'è subito anche
startService(intent);Forse è per far partire subito una volta l'intent prima che ne prenda il controllo l'AlarmManager...
A parte l'int i che viene reso 15, abbiamo capito che è tutto un codice per chiamare ripetutamente un Service chiamato response.
Quando questo Service ottiene una certa risposta da un server, chiama l'activity B: questa deve sopprimere l'AlarmManager dell'activity A, ed è stato provato questo codice:
Intent sintent = new Intent(this, response.class); pintent = PendingIntent.getService(this, 0, sintent, 0); alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE); stopService(sintent); alarm.cancel(pintent);che ci analizziamo ora...
Viene creato un Intent che chiama il Service, e viene incapsulato in un PendingIntent. Quindi viene creato un nuovo AlarmManager.
Per stoppare il Service, si usa, giustamente, stopService(sIntent), mentre per stoppare AlarmManager si cancella il PendingIntent che chiama il Service. Ma pare che la cosa non riesca...
La risposta è che bisogna creare l'Intent con il context dell'Activity A.
Come si fa?
Il suggerimento è di mettere in A questo:
private static Context context; public static Context getAppContext(){ return ActivityA.context; }Viene dichiarata una variabile statica privata context di tipo Context.
Quindi viene creata una funzione pubblica get-, nel miglior stile dell'incapsulamento, che restituisce la variabile precedente.
Ovviamente questa va inizializzata:
context=getApplicationContext();E quindi l'intent da "togliere" all'istanza di AlarmManager creata nell'Activity B viene costruito così:
Intent intent = new Intent(ActivityA.getAppContext(), ServiceClass.class);
intent.putExtra("fsasf", "bar");
PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);
AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
stopService(intent);
alarm.cancel(pintent);
contro il precedente:
Intent sintent = new Intent(this, response.class);
pintent = PendingIntent.getService(this, 0, sintent, 0);
alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
stopService(sintent);
alarm.cancel(pintent);
Nessun commento:
Posta un commento