Autore Topic: Apertura app all'avvio di onReceive() del BroadcastReceiver  (Letto 529 volte)

Offline BertoGT

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus One
Apertura app all'avvio di onReceive() del BroadcastReceiver
« il: 30 Agosto 2017, 18:26:59 CEST »
0
Ciao a tutti!
Ho un problemone che mi assilla ormai da un sacco di tempo che proprio non riesco a risolvere, spero di trovare qualcuno che mi possa dare una mano qua!

Nella mia applicazione c'è la possibilità che un utente venga avvisato quando è l'ora di eseguire un allenamento. Questo avviso deve essere tramite notifica e deve essere ripetuta ogni giorno alla stessa ora.
Per fare ciò ho implementato con AlarmManager (classe CreateAlarm) un allarme che all'orario scelto attiva un BroadCastReceiver (CreatoreNotificaAllenamento) che nel proprio onReceive() contiene il codice per il lancio della notifica.

Fino a qui tutto funziona correttamente: la notifica viene lanciata all'orario scelto.

Rimane però un problema che per essere più chiaro descrivo in punti:

  • OK: Se l'applicazione è in background (quindi aperto nella lista delle app recenti) la notifica viene inviata correttamente in modo classico
  • PROBLEMA: Se l'applicazione è completamente chiusa (non è nella lista delle app recenti) quando la notifica viene inviata l'applicazione si apre sulla MainActivity passando dunque in primo piano (foreground)

Il fatto curioso è che ho provato a utilizzare lo stesso codice per creare l'allarme e lo stesso BroadcastReceiver su un progetto vuoto e il problema non si presenta.
Qualcuno ha l'illuminazione per risolvere il problema?

Di seguito il codice delle classi citate:

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

    public static void setAlarm(Context c, Date data) {
        AlarmManager alarmMgr = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE);

        Intent intent = new Intent(c, CreatoreNotificaAllenamento.class);
        PendingIntent pi = PendingIntent.getBroadcast(c, 0, intent, 0);

        if(System.currentTimeMillis() > data.getTime()) {
            Calendar cal = Calendar.getInstance();
            cal.setTime(data);
            cal.add(Calendar.DAY_OF_YEAR, 1);
            data = cal.getTime();
        }
        alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, data.getTime(),
                AlarmManager.INTERVAL_DAY, pi);
    }
}

Codice (Java): [Seleziona]
public class CreatoreNotificaAllenamento extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        Intent in = new Intent(context, MainActivity.class)
                .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        long[] pattern = {0, 500, 1};
        PendingIntent pi = PendingIntent.getActivity(context, 0, in, PendingIntent.FLAG_UPDATE_CURRENT);
        Notification.Builder mBuilder = new Notification.Builder(context)
                .setSmallIcon(R.drawable.icona_notifica)
                .setContentTitle(context.getString(R.string.notifica_titolo_ricordo_allenamnto))
                .setContentText(context.getString(R.string.testo_notifica))
                .setVibrate(pattern)
                .setAutoCancel(true);

        mBuilder.setContentIntent(pi);
        mBuilder.setDefaults(Notification.DEFAULT_SOUND);
        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(0, mBuilder.build());
    }
}

Manifest:
Codice (XML): [Seleziona]
 <receiver android:name=".Algoritmi.CreatoreNotificaAllenamento" />

Offline BertoGT

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus One
Re:Apertura app all'avvio di onReceive() del BroadcastReceiver
« Risposta #1 il: 10 Settembre 2017, 12:04:37 CEST »
0
UP...

Offline capitancooker

  • Utente junior
  • **
  • Post: 119
  • Marco
  • Respect: +10
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    macOS High Sierra
Re:Apertura app all'avvio di onReceive() del BroadcastReceiver
« Risposta #2 il: 10 Settembre 2017, 18:09:44 CEST »
0
Non ho grande esperienza in merito, però credo che la notifica esegua quello che hai indicato nell'Intent:
Codice (Java): [Seleziona]
        Intent in = new Intent(context, MainActivity.class)
                .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Se vuoi che venga avviata un'altra actvity penso tu debba agire qui.
Ciao,
Marco
Se sbaglio, correggetemi.

Offline BertoGT

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus One
Re:Apertura app all'avvio di onReceive() del BroadcastReceiver
« Risposta #3 il: 10 Settembre 2017, 18:12:16 CEST »
0
Ciao, grazie per la risposta!

Avevo già provate a cambiare l'intent da aprire quando viene cliccata la notifica ma viene comunque aperta la Main.

Questo perchè l'activity viene aperta senza che venga cliccata la notifica!  :'(

Offline BertoGT

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus One
Re:Apertura app all'avvio di onReceive() del BroadcastReceiver
« Risposta #4 il: 18 Settembre 2017, 21:55:23 CEST »
0
Problema risolto.
Ho creato una classe App.java che andava a sostituire la classe Application di dafault che viene chiamata quando l'app viene avviata. Il problema era che nel suo metodo onCreate() avviavo un'activity. Questo metodo veniva creato non solo alla normale apertura dell'app, ma anche quando veniva attivato un Broadcast Receiver.