Autore Topic: Padroneggiare le notifiche  (Letto 456 volte)

Offline MaxAndroid

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Honor 6
  • Sistema operativo:
    Mint 17.1
Padroneggiare le notifiche
« il: 16 Giugno 2015, 15:04:29 CEST »
0
 Sono agli inizi con Android e mi sono appena iscritto quindi abbiate pietà :-)

Veniamo al dunque: allora sono riuscito ad ottenere una notifica funzionante attivando dalla mia Main Activity questa funzione:
Codice (Java): [Seleziona]
    public void setNotifica(Context context){
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.MONTH, 5);
        calendar.set(Calendar.YEAR, 2015);
        calendar.set(Calendar.DAY_OF_MONTH, 16);
        calendar.set(Calendar.HOUR_OF_DAY, 14);
        calendar.set(Calendar.MINUTE, 38);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.AM_PM,Calendar.PM);
        Intent myIntent = new Intent(context, MyReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, myIntent, 0);
        AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);

    }
Poi ho creato il Broadcast Receiver:

MyReceiver.java:
Codice (Java): [Seleziona]
public class MyReceiver extends BroadcastReceiver
{

    @Override
    public void onReceive(Context context, Intent intent)
    {
       Intent service1 = new Intent(context, MyAlarmService.class);
       context.startService(service1);

    }
}
E il service:

MyAlarmService.java:

Codice (Java): [Seleziona]
public class  MyAlarmService extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        intent = new Intent(this, Classe_Gestione_Notifiche.class);

        PendingIntent pIntent = TaskStackBuilder.create(this)
                .addNextIntentWithParentStack(intent)
                .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);


// build notification
// the addAction re-use the same intent to keep the example short
        Notification n  = new Notification.Builder(this)
                .setContentTitle(getResources().getString("Prova")
                .setContentText(getResources().getString("Prova")
                .setSmallIcon(R.drawable.logo)
                .setContentIntent(pIntent)
                .setAutoCancel(true).build();


        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        notificationManager.notify(0, n);


        return Service.START_NOT_STICKY;
    }

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

Tutto pare funzionare bene se non riavvio, peccato che al reboot  la notifica viene cancellata, leggendo la documentazione ho creato MyBootReceiver.java per ricevere il broadcast al boot:

Codice (Java): [Seleziona]
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import java.util.Calendar;

public class MyBootReceiver extends BroadcastReceiver
{

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {

            setNotifica(context);
        }

    }



    public void setNotifica(Context context){
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.MONTH, 5);
        calendar.set(Calendar.YEAR, 2015);
        calendar.set(Calendar.DAY_OF_MONTH, 16);
        calendar.set(Calendar.HOUR_OF_DAY, 14);
        calendar.set(Calendar.MINUTE, 38);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.AM_PM,Calendar.PM);
        Intent myIntent = new Intent(context, MyReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, myIntent, 0);
        AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);

    }

}

Nel manifest ho aggiunto:
Codice (XML): [Seleziona]
 <receiver android:name=".MyReceiver"/>

         <receiver
           android:name=".MyBootReceiver"
           android:enabled="true"
           android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

E tra i permessi:
Codice (XML): [Seleziona]
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
Ma al successivo reboot non accade nulla.

Quale potrebbe essere il problema?
 Grazie e scusatemi per aver postato tutto questo codice!
« Ultima modifica: 16 Giugno 2015, 15:09:39 CEST da MaxAndroid »

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:Padroneggiare le notifiche
« Risposta #1 il: 16 Giugno 2015, 19:03:13 CEST »
0
Nella sezione Snippet avevo indicato un modo per lanciare l'evento BOOT_COMPLETED sull'emulatore, usando un comando ADB. Ora vado di fretta, ma non dovrebbe essere difficile trovarlo. Magari potresti provare a lanciarlo in quel modo, anche più volte, così da vedere in dettaglio nel LogCat cosa non va.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store