Autore Topic: reimpostare Alarm manager  (Letto 1064 volte)

Offline deb9

  • Nuovo arrivato
  • *
  • Post: 48
  • Respect: +1
    • Mostra profilo
reimpostare Alarm manager
« il: 17 Settembre 2013, 10:48:53 CEST »
0
caio a tutti ho un applicazione che manda delle notifiche queste notifiche devono essere presenti anche se il cellulare è stato spento quindi per qusto ho salvato la data con shared preferences. adesso il problema è reimpostare il timer come posso fare??
Codice (Java): [Seleziona]
public class MyReceiver extends BroadcastReceiver {
        private final static String MY_PREFERENCES = "TimeInMillis";
        // Costante relativa al nome della particolare preferenza
        private final static String TEXT_DATA_KEY = "Data";
        private PendingIntent pendingIntent;
        private AlarmManager alarmManager;
        @Override
        public void onReceive(Context context, Intent intent) {
                try {
                        if("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())){
                               
                           }else{
                        Intent service1 = new Intent(context, MyAlarmService.class);
                        context.startService(service1);
                        Log.i("com.example.changetime.MyAlarmService", "Notifica_Partita");}
                } catch (Exception e) {
                        Toast.makeText(context, "Errore", Toast.LENGTH_LONG).show();
                }
        }  
}
Il service
Codice (Java): [Seleziona]
public class MyAlarmService extends Service {
        private final static String MY_PREFERENCES = "TimeInMillis";
        // Costante relativa al nome della particolare preferenza
        private final static String TEXT_DATA_KEY = "Data";
        private Intent myIntent;
        private PendingIntent pendingIntent;
        private AlarmManager alarmManager;

        @Override
        public IBinder onBind(Intent arg0) {
                // TODO Auto-generated method stub
                return null;
        }

        @Override
        public void onCreate() {
                // TODO Auto-generated method stub
                super.onCreate();
        }

        @Override
        public void onStart(Intent intent, int startId) {

                // // Leggiamo le Preferences
                // SharedPreferences prefs = getSharedPreferences(MY_PREFERENCES,
                // Context.MODE_PRIVATE);
                // // Leggiamo l'informazione associata alla proprietà TEXT_DATA
                // Long TextTime = prefs.getLong(TEXT_DATA_KEY, 0);
                // Intent myIntent = new Intent(MyAlarmService.this, MyReceiver.class);
                // pendingIntent = PendingIntent.getBroadcast(MyAlarmService.this, 0,
                // myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
                // alarmManager.set(AlarmManager.RTC_WAKEUP, TextTime, pendingIntent);
                Log.i("com.example.changetime.MyAlarmService", "Notifica");
                NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(
                                MyAlarmService.this);
                notificationBuilder.setContentTitle("Scadenza");
                notificationBuilder.setContentText("Il farmaco sta scadendo");
                // Testo che compare nella barra di stato non appena compare la
                // notifica
                notificationBuilder.setTicker("Scadenza");
                // Data e ora della notifica
                notificationBuilder.setWhen(System.currentTimeMillis());
                // Icona della notifica
                notificationBuilder.setSmallIcon(R.drawable.ic_launcher);
                // autocancellazione
                notificationBuilder.setAutoCancel(true);
                // Creiamo il pending intent che verrà lanciato quando la notifica
                // viene premuta
                Intent notificationIntent = new Intent(this, MainActivity.class);
                PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                                notificationIntent, 0);
                notificationBuilder.setContentIntent(contentIntent);
                mNotificationManager.notify(1, notificationBuilder.build());
                notificationBuilder.setDefaults(Notification.DEFAULT_SOUND
                                | Notification.DEFAULT_LIGHTS);
        }
        @Override
        public void onDestroy() {
                // TODO Auto-generated method stub
                super.onDestroy();
        }

}
e la classe Principale che imposta tutto in partenza
Codice (Java): [Seleziona]
public class MainActivity extends Activity implements OnClickListener {
        TimePicker timePicker;
        DatePicker datePicker;
        Button ButtonSet;
        AlarmManager alarmManager;
        Calendar calendario;
        private PendingIntent pendingIntent;
        ToggleButton SetnotificationButton;
        TextView TestoCompleto;
        // Identificatore delle preferenze dell'applicazione
        private final static String MY_PREFERENCES = "TimeInMillis";
        // Costante relativa al nome della particolare preferenza
        private final static String TEXT_DATA_KEY = "Data";

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                inizializza();
                updatePreferencesData();
                SetnotificationButton.setOnClickListener(this);
                ButtonSet.setOnClickListener(this);
        } // end onCreate

        private void inizializza() {
                ButtonSet = (Button) findViewById(R.id.btnSetAlarm);
                timePicker = (TimePicker) findViewById(R.id.timePicker);
                datePicker = (DatePicker) findViewById(R.id.datePicker);
                calendario = Calendar.getInstance();
                alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                SetnotificationButton = (ToggleButton) findViewById(R.id.toggleButton1);
                TestoCompleto = (TextView) findViewById(R.id.textView1);
        }

        private void setCalendario() {
                // imposto orario
                calendario.set(Calendar.YEAR, datePicker.getYear());
                calendario.set(Calendar.MONTH, datePicker.getMonth());
                calendario.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth());
                calendario.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour());
                calendario.set(Calendar.MINUTE, timePicker.getCurrentMinute());
                calendario.set(Calendar.SECOND, 0);
        }

        public void savePreferencesData() {
                // Otteniamo il riferimento alle Preferences
                SharedPreferences prefs = getSharedPreferences(MY_PREFERENCES,
                                Context.MODE_PRIVATE);
                // Otteniamo il corrispondente Editor
                SharedPreferences.Editor editor = prefs.edit();
                // Modifichiamo il valore con quello inserito nel calendario
                setCalendario();
                Long time = calendario.getTimeInMillis();
                editor.putLong(TEXT_DATA_KEY, Long.valueOf(time));
                editor.commit();
                updatePreferencesData();
        }
         private void updatePreferencesData(){
         // Leggiamo le Preferences
         SharedPreferences prefs = getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
         // Leggiamo l'informazione associata alla proprietà TEXT_DATA
         Long TextTime = prefs.getLong(TEXT_DATA_KEY, 0);
         // Lo impostiamo alla TextView
         TestoCompleto.setText("" + TextTime);
 }

        @Override
        public void onClick(View v) {
                // TODO Auto-generated method stub
                switch (v.getId()) {
                case R.id.toggleButton1:
                        if (SetnotificationButton.isChecked() == true) {
                                ButtonSet.setEnabled(true);
                        } else {
                                ButtonSet.setEnabled(false);
                                Toast.makeText(getApplicationContext(), "Notifica disattivata",
                                                Toast.LENGTH_LONG).show();
                        }
                        break;
                case R.id.btnSetAlarm:
                        setCalendario();
                        savePreferencesData();
                        updatePreferencesData();
                        Intent myIntent = new Intent(MainActivity.this,
                                        MyReceiver.class);
                        pendingIntent = PendingIntent.getBroadcast(MainActivity.this,
                                        0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
                        alarmManager.set(AlarmManager.RTC_WAKEUP,
                                        calendario.getTimeInMillis(), pendingIntent);
                        break;
                }
        }
}
Non so come richiamre il long nelle shared preferences per reimpostare il timer

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:reimpostare Alarm manager
« Risposta #1 il: 17 Settembre 2013, 13:43:10 CEST »
0
Cattura l'evento BOOT_COMPLETED con un receiver e reimposta tutti gli alarmmanager che ti occorrono.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline deb9

  • Nuovo arrivato
  • *
  • Post: 48
  • Respect: +1
    • Mostra profilo
Re:reimpostare Alarm manager
« Risposta #2 il: 17 Settembre 2013, 14:14:25 CEST »
0
si ok ricevo all' avvio ma come reimposto il timer?? questo non mi viene mi serve capire

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:reimpostare Alarm manager
« Risposta #3 il: 17 Settembre 2013, 18:16:13 CEST »
0
si ok ricevo all' avvio ma come reimposto il timer?? questo non mi viene mi serve capire

Allora, non so di preciso cosa devi fare, ma ti dico cosa ho fatto io nella mia app.

Nell'app ho una specie di database (ma potrebbero essere anche le sharedpreferences) con date e orari a cui fare un certa azione, nel mio caso generare una notifica 5 minuti prima della partenza del Gran Premio di formula 1.

Con il receiver catturo l'evento dell'avvio telefono (BOOT_COMPLETED), da cui vado a cercare il prossimo gran premio (data e ora), e imposto l'alarmManager di conseguenza.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline deb9

  • Nuovo arrivato
  • *
  • Post: 48
  • Respect: +1
    • Mostra profilo
Re:reimpostare Alarm manager
« Risposta #4 il: 17 Settembre 2013, 18:29:26 CEST »
0
Si ok pero non so come richiamare l alarm manager dove lo devo riprendere nella classe che estende broadcast receiver?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:reimpostare Alarm manager
« Risposta #5 il: 17 Settembre 2013, 19:37:23 CEST »
0
Si ok pero non so come richiamare l alarm manager dove lo devo riprendere nella classe che estende broadcast receiver?

Non riprendi niente. Al boot devi crearne di nuovi.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline deb9

  • Nuovo arrivato
  • *
  • Post: 48
  • Respect: +1
    • Mostra profilo
Re:reimpostare Alarm manager
« Risposta #6 il: 17 Settembre 2013, 20:15:11 CEST »
0
Facendo solo alarm.set()? Scusa se ti chiedo ma ho provato un po ma non mi va mai se mi dai anche in pseudocodice la tua idea saresti gentilissimo :)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:reimpostare Alarm manager
« Risposta #7 il: 17 Settembre 2013, 21:30:42 CEST »
0
Ti copia e incollo la parte essenziale del codice della mia app (tolgo il codice non rilevante).

Codice (Java): [Seleziona]
public class IntentReceiver extends BroadcastReceiver {

   private static final String BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
   public static Context mContext;
   
   @Override
   public void onReceive(Context context,Intent i) {
      mContext = context;
      if (i.getAction().equals(BOOT_COMPLETED)) {
         if (mContext!=null) {
            Toolbox.setAlarm(mContext,orario_alarm);
         }
      }
   }

}


Codice (Java): [Seleziona]
public class Toolbox {

   public static void setAlarm(Context context,long when) {
      AlarmManager al = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
      int alType = AlarmManager.RTC_WAKEUP;
      Intent intentToFire = new Intent(ALARM_ACTION);
      PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0,intentToFire,0);
      al.set(alType,when,pendingIntent);
   }

}
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline deb9

  • Nuovo arrivato
  • *
  • Post: 48
  • Respect: +1
    • Mostra profilo
Re:reimpostare Alarm manager
« Risposta #8 il: 18 Settembre 2013, 12:50:03 CEST »
0
ciao scusa non riesco a stare tanto su questo progetto ho modificato come mi hai detto
Codice (Java): [Seleziona]
public class MyReceiver extends BroadcastReceiver {
          private static final String BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
          public static Context mContext;
                // Identificatore delle preferenze dell'applicazione
                private final static String MY_PREFERENCES = "TimeInMillis";
                // Costante relativa al nome della particolare preferenza
                private final static String TEXT_DATA_KEY = "Data";
        @Override
        public void onReceive(Context context, Intent intent) {
                try {
                         mContext = context;
                      if (intent.getAction().equals(BOOT_COMPLETED)) {
                             SharedPreferences prefs = context.getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
                             // Leggiamo l'informazione associata alla proprietà TEXT_DATA
                             Long TextTime = prefs.getLong(TEXT_DATA_KEY, 0);
                            Toolbox.setAlarm(mContext,TextTime);
                      }
                        Intent service1 = new Intent(context, MyAlarmService.class);
                        context.startService(service1);
                        Log.i("com.example.changetime.MyAlarmService", "Notifica_Partita");
                } catch (Exception e) {
                        Toast.makeText(context, "Errore", Toast.LENGTH_LONG).show();
                }
        }  
}
e ho creato la classe ToolBox nel Main activity. Adesso praticamente nella classe c he estende broadcast receiver non finisce il try e interviene il catch indicandomi l'errore.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:reimpostare Alarm manager
« Risposta #9 il: 18 Settembre 2013, 14:02:54 CEST »
0
E quale errore ti da' ?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline deb9

  • Nuovo arrivato
  • *
  • Post: 48
  • Respect: +1
    • Mostra profilo
Re:reimpostare Alarm manager
« Risposta #10 il: 18 Settembre 2013, 14:20:32 CEST »
0
Null pointer exception ma se tolgo tutta la parte dell' if va bene
Codice (Java): [Seleziona]
  if (intent.getAction().equals(BOOT_COMPLETED)) {
                          // riprendo il valore salvato
                             SharedPreferences prefs = context.getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
                             // Leggiamo l'informazione associata alla proprietà TEXT_DATA
                             Long TextTime = prefs.getLong(TEXT_DATA_KEY, 0);
                            Toolbox.setAlarm(mContext,TextTime);
                      }
                        Intent service1 = new Intent(context, MyAlarmService.class);
                        context.startService(service1);
cosi non va ma cosi va
Codice (Java): [Seleziona]
        Intent service1 = new Intent(context, MyAlarmService.class);
                        context.startService(service1);
Pure se metto sotto commento quello all' interno dell'if rimane l'errore

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:reimpostare Alarm manager
« Risposta #11 il: 18 Settembre 2013, 14:29:23 CEST »
0
se metti il LogCat magari c'è qualche dettaglio in più
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline deb9

  • Nuovo arrivato
  • *
  • Post: 48
  • Respect: +1
    • Mostra profilo
Re:reimpostare Alarm manager
« Risposta #12 il: 18 Settembre 2013, 17:02:48 CEST »
0
Sul LogCat non mi da errori del pacchetto non arriva nemmeno al Log che ho creato io dopo lo startservice

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:reimpostare Alarm manager
« Risposta #13 il: 18 Settembre 2013, 17:18:55 CEST »
0
Sul LogCat non mi da errori del pacchetto non arriva nemmeno al Log che ho creato io dopo lo startservice

Allora posta le righe dove leggi della NullPointerException di cui parli.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline deb9

  • Nuovo arrivato
  • *
  • Post: 48
  • Respect: +1
    • Mostra profilo
Re:reimpostare Alarm manager
« Risposta #14 il: 18 Settembre 2013, 17:37:37 CEST »
0
NEL TRY CATCH di questa classe mi da java.nullpointer exception
Codice (Java): [Seleziona]
public class MyReceiver extends BroadcastReceiver {
          private static final String BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
          public static Context mContext;
                // Identificatore delle preferenze dell'applicazione
                private final static String MY_PREFERENCES = "TimeInMillis";
                // Costante relativa al nome della particolare preferenza
                private final static String TEXT_DATA_KEY = "Data";
        @Override
        public void onReceive(Context context, Intent intent) {
                try {
                         mContext = context;
// da QUA MI DA L'ERRORE
                      if (intent.getAction().equals(BOOT_COMPLETED)) {
                             SharedPreferences prefs = context.getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
                             // Leggiamo l'informazione associata alla proprietà TEXT_DATA
                             Long TextTime = prefs.getLong(TEXT_DATA_KEY, 0);
                            Toolbox.setAlarm(mContext,TextTime);
                      }
                        Intent service1 = new Intent(context, MyAlarmService.class);
                        context.startService(service1);
                        Log.i("com.example.changetime.MyAlarmService", "Notifica_Partita");
                } catch (Exception e) {
                        Toast.makeText(context, "Errore", Toast.LENGTH_LONG).show();
                }
        }  
}
Questa invece è la classe principale in cui imposto il timer e metto la classe toolbox
Codice (Java): [Seleziona]
public class MainActivity extends Activity implements OnClickListener {
        TimePicker timePicker;
        DatePicker datePicker;
        Button ButtonSet;
        Calendar calendario;
        private PendingIntent pendingIntent;
        ToggleButton SetnotificationButton;
        TextView TestoCompleto;
        // Identificatore delle preferenze dell'applicazione
        private final static String MY_PREFERENCES = "TimeInMillis";
        // Costante relativa al nome della particolare preferenza
        private final static String TEXT_DATA_KEY = "Data";

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                inizializza();
                updatePreferencesData();
                SetnotificationButton.setOnClickListener(this);
                ButtonSet.setOnClickListener(this);
        } // end onCreate

        private void inizializza() {
                ButtonSet = (Button) findViewById(R.id.btnSetAlarm);
                timePicker = (TimePicker) findViewById(R.id.timePicker);
                datePicker = (DatePicker) findViewById(R.id.datePicker);
                calendario = Calendar.getInstance();
                SetnotificationButton = (ToggleButton) findViewById(R.id.toggleButton1);
                TestoCompleto = (TextView) findViewById(R.id.textView1);
        }

        private long setCalendario() {
                // imposto orario
                calendario.set(Calendar.YEAR, datePicker.getYear());
                calendario.set(Calendar.MONTH, datePicker.getMonth());
                calendario.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth());
                calendario.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour());
                calendario.set(Calendar.MINUTE, timePicker.getCurrentMinute());
                calendario.set(Calendar.SECOND, 0);
                return calendario.getTimeInMillis();
        }

        public void savePreferencesData() {
                // Otteniamo il riferimento alle Preferences
                SharedPreferences prefs = getSharedPreferences(MY_PREFERENCES,
                                Context.MODE_PRIVATE);
                // Otteniamo il corrispondente Editor
                SharedPreferences.Editor editor = prefs.edit();
                // Modifichiamo il valore con quello inserito nel calendario
                setCalendario();
                Long time = calendario.getTimeInMillis();
                editor.putLong(TEXT_DATA_KEY, Long.valueOf(time));
                editor.commit();
                updatePreferencesData();
        }
         private void updatePreferencesData(){
         // Leggiamo le Preferences
         SharedPreferences prefs = getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
         // Leggiamo l'informazione associata alla proprietà TEXT_DATA
         Long TextTime = prefs.getLong(TEXT_DATA_KEY, 0);
         // Lo impostiamo alla TextView
         TestoCompleto.setText("" + TextTime);
 }

        @Override
        public void onClick(View v) {
                switch (v.getId()) {
                case R.id.toggleButton1:
                        if (SetnotificationButton.isChecked() == true) {
                                ButtonSet.setEnabled(true);
                        } else {
                                ButtonSet.setEnabled(false);
                                Toast.makeText(getApplicationContext(), "Notifica disattivata",
                                                Toast.LENGTH_LONG).show();
                        }
                        break;
                case R.id.btnSetAlarm:
                        setCalendario();
                        Toolbox.setAlarm(getApplicationContext(), setCalendario());
                        savePreferencesData();
                        updatePreferencesData();
                        break;
                }
        }
        public static class Toolbox {

                   public static void setAlarm(Context context,long when) {
                      AlarmManager al = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
                      int alType = AlarmManager.RTC_WAKEUP;
                      Intent intentToFire = new Intent(context, MyReceiver.class);
                      PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0,intentToFire,0);
                      al.set(alType,when,pendingIntent);
                   }

                }
}
Infine che una classe che estende service e crea la notifica