Autore Topic: Programmare notifiche per una determinata ora  (Letto 902 volte)

Offline lemmasim

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Windows 8.1 64 bit
Programmare notifiche per una determinata ora
« il: 24 Dicembre 2014, 16:59:42 CET »
0
Vorrei far arrivare una notifica tot secondi dopo che un button è stato premuto tramite service
Perché se esco dall'app la notifica non arriva, mentre invece se ci rimango sì? Come posso fare a programmare delle notifiche in modo che arrivino a una certa ora o dopo tot tempo?
Nel frattempo, ecco la classe del Service (non metto l'activity perché è sicuramente funzionante perché, come detto prima, il service funziona finché lascio l'app in esecuzione, ma non funziona se la chiudo)


Codice (Java): [Seleziona]
package com.example.notifiche;

import android.app.IntentService;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;

public class NotificationService extends IntentService{

        public NotificationService() {
                super("NotificationService");
        }

        @Override
        protected void onHandleIntent(Intent intent) {
                try {
                        Thread.sleep(10000);
                } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                Intent i=new Intent(this,MessageActivity.class);
                PendingIntent pi=PendingIntent.getActivity(this, 0, i, 0);
                Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                NotificationCompat.Builder n  = new NotificationCompat.Builder(this)
                .setContentTitle("Arrivato nuovo messaggio!!")
                .setContentText("Autore: Nicola Rossi")
                .setSmallIcon(android.R.drawable.ic_dialog_email)
                .setContentIntent(pi)
                .setAutoCancel(true)
                .setSound(sound);
                 
                NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                        notificationManager.notify(0, n.build());
        }

}

Post unito: 24 Dicembre 2014, 17:02:30 CET
AGGIUNTA: ho notato che se non chiudo l'app tramite multitasking, la notifica arriva, ma io vorrei che arrivasse anche se l'app fosse completamente chiusa, possibilmente anche se non fosse mai stata aperta dall'accensione del cellulare
« Ultima modifica: 24 Dicembre 2014, 17:02:30 CET da lemmasim, Reason: Merged DoublePost »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1227
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Programmare notifiche per una determinata ora
« Risposta #1 il: 24 Dicembre 2014, 18:22:34 CET »
0
Crei un service. Esso rimane in back ground.

Offline lemmasim

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Windows 8.1 64 bit
Re:Programmare notifiche per una determinata ora
« Risposta #2 il: 27 Dicembre 2014, 14:04:40 CET »
0
ok, ma come faccio a risolvere questo problema?

Offline lemmasim

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Windows 8.1 64 bit
Re:Programmare notifiche per una determinata ora
« Risposta #3 il: 28 Dicembre 2014, 19:38:22 CET »
0
ho risolto copiancollando la classe che si trova qua Services | Android Developers  nel paragrafo Extending the Service class
Codice (Java): [Seleziona]
public class HelloService extends Service {
          private Looper mServiceLooper;
          private ServiceHandler mServiceHandler;

          private final class ServiceHandler extends Handler {
              public ServiceHandler(Looper looper) {
                  super(looper);
              }
              @Override
              public void handleMessage(Message msg) {
                  while(!(Calendar.getInstance().get(Calendar.HOUR_OF_DAY)==17 && Calendar.getInstance().get(Calendar.MINUTE)==25)){
                      synchronized (this) {
                          try {
                                        wait(10000);
                                } catch (InterruptedException e) {
                                        e.printStackTrace();
                                }
              }
                  }
                                //praticamente l'unica parte gestita interamente da me è questa in cui invio la notifica,
                                //vabbé ho anche gestito la condizione del while, ma tutto il codice all'interno è copiato
                                Intent i=new Intent(HelloService.this,MessageActivity.class);
                                PendingIntent pi=PendingIntent.getActivity(HelloService.this, 0, i, 0);
                                Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                                NotificationCompat.Builder n  = new NotificationCompat.Builder(HelloService.this)
                                .setContentTitle("Arrivato nuovo messaggio!!")
                                .setContentText("Autore: Nicola Rossi")
                                .setSmallIcon(android.R.drawable.ic_dialog_email)
                                .setContentIntent(pi)
                                .setAutoCancel(true)
                                .setSound(sound);
                                 
                                NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                                        notificationManager.notify(0, n.build());



                  stopSelf(msg.arg1);
              }
          }

          @Override
          public void onCreate() {
            HandlerThread thread = new HandlerThread("ServiceStartArguments",
                    Process.THREAD_PRIORITY_BACKGROUND);
            thread.start();
            mServiceLooper = thread.getLooper();
            mServiceHandler = new ServiceHandler(mServiceLooper);
          }

          @Override
          public int onStartCommand(Intent intent, int flags, int startId) {
              Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
              Message msg = mServiceHandler.obtainMessage();
              msg.arg1 = startId;
              mServiceHandler.sendMessage(msg);

              return START_STICKY;
          }

          @Override
          public IBinder onBind(Intent intent) {
              return null;
          }

          @Override
          public void onDestroy() {
            Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
          }
        }

Offline tommy95

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4 mini
  • Sistema operativo:
    Windows 8.1
Re:Programmare notifiche per una determinata ora
« Risposta #4 il: 05 Giugno 2015, 10:13:40 CEST »
0
ho risolto copiancollando la classe che si trova qua Services | Android Developers  nel paragrafo Extending the Service class
Codice (Java): [Seleziona]
public class HelloService extends Service {
          private Looper mServiceLooper;
          private ServiceHandler mServiceHandler;

          private final class ServiceHandler extends Handler {
              public ServiceHandler(Looper looper) {
                  super(looper);
              }
              @Override
              public void handleMessage(Message msg) {
                  while(!(Calendar.getInstance().get(Calendar.HOUR_OF_DAY)==17 && Calendar.getInstance().get(Calendar.MINUTE)==25)){
                      synchronized (this) {
                          try {
                                        wait(10000);
                                } catch (InterruptedException e) {
                                        e.printStackTrace();
                                }
              }
                  }
                                //praticamente l'unica parte gestita interamente da me è questa in cui invio la notifica,
                                //vabbé ho anche gestito la condizione del while, ma tutto il codice all'interno è copiato
                                Intent i=new Intent(HelloService.this,MessageActivity.class);
                                PendingIntent pi=PendingIntent.getActivity(HelloService.this, 0, i, 0);
                                Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                                NotificationCompat.Builder n  = new NotificationCompat.Builder(HelloService.this)
                                .setContentTitle("Arrivato nuovo messaggio!!")
                                .setContentText("Autore: Nicola Rossi")
                                .setSmallIcon(android.R.drawable.ic_dialog_email)
                                .setContentIntent(pi)
                                .setAutoCancel(true)
                                .setSound(sound);
                                 
                                NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                                        notificationManager.notify(0, n.build());



                  stopSelf(msg.arg1);
              }
          }

          @Override
          public void onCreate() {
            HandlerThread thread = new HandlerThread("ServiceStartArguments",
                    Process.THREAD_PRIORITY_BACKGROUND);
            thread.start();
            mServiceLooper = thread.getLooper();
            mServiceHandler = new ServiceHandler(mServiceLooper);
          }

          @Override
          public int onStartCommand(Intent intent, int flags, int startId) {
              Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
              Message msg = mServiceHandler.obtainMessage();
              msg.arg1 = startId;
              mServiceHandler.sendMessage(msg);

              return START_STICKY;
          }

          @Override
          public IBinder onBind(Intent intent) {
              return null;
          }

          @Override
          public void onDestroy() {
            Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
          }
        }

Ciao, mi potresti spiegare come lo richiami nell'activity?