Autore Topic: Inviare Notifica ad una determinata ora  (Letto 851 volte)

Offline RexL

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
Inviare Notifica ad una determinata ora
« il: 22 Gennaio 2015, 19:29:26 CET »
0
Salve a tutti, sono nuovo del Forum e vorrei complimentarmi con tutti coloro che lo rendono così interessante.
Vi spiego il mio problema: ho creato un app che mi permette(tramite database)di memorizzare il nome delle medicine che devo prendere e l'orario in cui prenderle; il mio problema è il seguente: come faccio ad inviare una notifica una volta arrivata l'ora in cui prendere la medicina in maniera tale che l'utente possa ricordarsi di prendere il medicinale?
Chi è così gentile da scrivermi il codice sorgente per poter fare ciò?
Vi ringrazio in anticipo

Offline ejntoo

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: +1
    • magratheadesign
    • Mostra profilo
    • Magrathea design
  • Dispositivo Android:
    Samsung Galaxy Mini
  • Play Store ID:
    Magrathea design
  • Sistema operativo:
    Linux Mint
Re:Inviare Notifica ad una determinata ora
« Risposta #1 il: 23 Gennaio 2015, 12:40:12 CET »
+1
L'idea è abbastanza semplice: devi usare un oggetto AlarmManager, che permette di attivare un Intent a un orario stabilito, indipendentemente dal fatto che l'applicazione sia in esecuzione o chiusa:
Codice (Java): [Seleziona]
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, MyBroadcastReceiver.class);
intent.putExtra("id", itemId);
PendingIntent pi = PendingIntent.getBroadcast(context, itemId, intent, 0);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, time, AlarmManager.INTERVAL_DAY, pi);

dove time è l'orario stabilito in millisecondi, itemId è un id univoco che identifica l'elemento (medicina) in questione (può coincidere quindi con il campo _id del database), mentre MyBroadcastReceiver è il BroadcastReceiver che dovrà ricevere l'Intent in questione e creare la notifica nel modo più consueto possibile. Ad esempio:
Codice (Java): [Seleziona]
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_TAG);
        wl.acquire();

        int notificationId = intent.getIntExtra("id", 0);
        Intent resultIntent = new Intent(context, ActivityToLaunch.class);
        resultIntent.putExtra("id", notificationId);
        PendingIntent resultPendingIntent =
                PendingIntent.getActivity(context, 0, resultIntent, 0);

        NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(context)
            .setContentTitle(/* Elabora testo qui recuperando le informazioni dal database */)
            .setContentIntent(resultPendingIntent)
            .setAutoCancel(true);

        NotificationManager notifyMgr =
                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notifyMgr.notify(notificationId, notificationBuilder.build());

        wl.release();
    }
I due comandi wl.acquire() e wl.release servono a ottenere il wakelock per "risvegliare" il dispositivo qualora si trovasse a riposo (cioè con lo schermo spento).

Offline RexL

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
Re:Inviare Notifica ad una determinata ora
« Risposta #2 il: 23 Gennaio 2015, 17:35:13 CET »
0
Grazie mille ejntoo!!! L'unica cosa che non mi è chiara è come far capire all'app che il "time" della notifica deve essere quello inserito dall'utente nel database alla voce "time".
Sono riuscito a spiegare il mio dubbio?

Offline ejntoo

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: +1
    • magratheadesign
    • Mostra profilo
    • Magrathea design
  • Dispositivo Android:
    Samsung Galaxy Mini
  • Play Store ID:
    Magrathea design
  • Sistema operativo:
    Linux Mint
Re:Inviare Notifica ad una determinata ora
« Risposta #3 il: 23 Gennaio 2015, 17:49:06 CET »
0
Certo! Ovviamente il time devi recuperarlo dal database a partire dall'id che identifica l'elemento (rappresentato dalla variabile timeId). per far questo devi ovviamente convertire l'orario che l'utente sceglie del TimePicker in millisecondi.

Offline RexL

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
Re:Inviare Notifica ad una determinata ora
« Risposta #4 il: 23 Gennaio 2015, 19:08:23 CET »
0
Caro ejntoo, hai facebook? possiamo parlare in privato li per favore??
Grazie in anticipo
« Ultima modifica: 23 Gennaio 2015, 19:25:54 CET da RexL »

Offline tommy95

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4 mini
  • Sistema operativo:
    Windows 8.1
Re:Inviare Notifica ad una determinata ora
« Risposta #5 il: 04 Giugno 2015, 11:41:40 CEST »
0
Salve a tutti, sono nuovo del Forum e vorrei complimentarmi con tutti coloro che lo rendono così interessante.
Vi spiego il mio problema: ho creato un app che mi permette(tramite database)di memorizzare il nome delle medicine che devo prendere e l'orario in cui prenderle; il mio problema è il seguente: come faccio ad inviare una notifica una volta arrivata l'ora in cui prendere la medicina in maniera tale che l'utente possa ricordarsi di prendere il medicinale?
Chi è così gentile da scrivermi il codice sorgente per poter fare ciò?
Vi ringrazio in anticipo
L'idea è abbastanza semplice: devi usare un oggetto AlarmManager, che permette di attivare un Intent a un orario stabilito, indipendentemente dal fatto che l'applicazione sia in esecuzione o chiusa:
Codice (Java): [Seleziona]
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, MyBroadcastReceiver.class);
intent.putExtra("id", itemId);
PendingIntent pi = PendingIntent.getBroadcast(context, itemId, intent, 0);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, time, AlarmManager.INTERVAL_DAY, pi);

dove time è l'orario stabilito in millisecondi, itemId è un id univoco che identifica l'elemento (medicina) in questione (può coincidere quindi con il campo _id del database), mentre MyBroadcastReceiver è il BroadcastReceiver che dovrà ricevere l'Intent in questione e creare la notifica nel modo più consueto possibile. Ad esempio:
Codice (Java): [Seleziona]
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_TAG);
        wl.acquire();

        int notificationId = intent.getIntExtra("id", 0);
        Intent resultIntent = new Intent(context, ActivityToLaunch.class);
        resultIntent.putExtra("id", notificationId);
        PendingIntent resultPendingIntent =
                PendingIntent.getActivity(context, 0, resultIntent, 0);

        NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(context)
            .setContentTitle(/* Elabora testo qui recuperando le informazioni dal database */)
            .setContentIntent(resultPendingIntent)
            .setAutoCancel(true);

        NotificationManager notifyMgr =
                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notifyMgr.notify(notificationId, notificationBuilder.build());

        wl.release();
    }
I due comandi wl.acquire() e wl.release servono a ottenere il wakelock per "risvegliare" il dispositivo qualora si trovasse a riposo (cioè con lo schermo spento).

Ciao, sto facendo una cosa simile. Ma mi sono bloccato in un punto, cioè quello in cui una volta inserita la data, convertita in millisecondi etc. io voglio che la notifica mi si visualizzi anche se la mia app è stata "Killata", c'è un modo? Come posso fare= O nel caso ovviare a questa situazione?

Grazie