Autore Topic: Notifiche android con AlarmManager + BroadcastReceiver  (Letto 1079 volte)

Offline AntoLev

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5 - gs4
  • Sistema operativo:
    mac os x 10.9 - windows 7 professional
Notifiche android con AlarmManager + BroadcastReceiver
« il: 03 Marzo 2014, 22:56:35 CET »
0
Salve a tutti. Ho un problema. Sto creando un app che, in base a degli orari registrati sul db, credi degli alarmManager e scatena una notifica quando necessario.
Nel mio caso, però, la notifica viene mostrata soltanto quando l'app è aperta.
Questo è il mio codice.

BroadCastReceiver
Codice (Java): [Seleziona]
public void onReceive(Context context, Intent intent) {
                Bundle bu = intent.getExtras();
                int Code = 0;
                if (bu != null) {
                        Code = bu.getInt("TIME_CODE");
                }
                Intent MyServiceIntent = new Intent(context, ServiceNotification.class);
                MyServiceIntent.putExtra("TIME_CODE", Code);
                context.startService(MyServiceIntent);
        }

Service
Codice (Java): [Seleziona]
public void onStart(Intent intent, int startId) {
                super.onStart(intent, startId);
                Bundle bu = intent.getExtras();
                int TimeCode = 0;
                if (bu != null) {
                        TimeCode = bu.getInt("TIME_CODE");
                }

                NotificationManager mManager;
                mManager = (NotificationManager) this.getApplicationContext()
                                .getSystemService(
                                                this.getApplicationContext().NOTIFICATION_SERVICE);
                Intent intent1 = new Intent(this.getApplicationContext(),
                                MainActivity.class);

                Notification notification = new Notification(R.drawable.ic_launcher,
                                "Nuovo messaggio da cura alert", System.currentTimeMillis());
                intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
                                | Intent.FLAG_ACTIVITY_CLEAR_TOP);

                PendingIntent pendingNotificationIntent = PendingIntent.getActivity(
                                this.getApplicationContext(), 0, intent1,
                                PendingIntent.FLAG_UPDATE_CURRENT);

                notification.flags |= Notification.FLAG_AUTO_CANCEL;
                notification.setLatestEventInfo(this.getApplicationContext(),
                                "Le notifiche funzionano", "It is working....",
                                pendingNotificationIntent);
                notification.vibrate = new long[] { 100L, 100L, 200L, 500L };

                mManager.notify(TimeCode, notification);
                try {
                        Uri notification_uri = RingtoneManager
                                        .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                        Ringtone r = RingtoneManager.getRingtone(getApplicationContext(),
                                        notification_uri);
                        r.play();
                } catch (Exception e) {
                        Log.e("ECCEZIONE SERVIZIO", e.getMessage());
                }
        }
Metodo che elimina i PendingIntent e crea nuovamente gli AlarmManager
Codice (Java): [Seleziona]
for (int i = 0; i < TimeItem.size(); ++i) {
                        AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                        Intent intent = new Intent(this, AlarmReceiver.class);
                        intent.putExtra("TIME_CODE", i);
                        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, i,
                                        intent, PendingIntent.FLAG_CANCEL_CURRENT);
                        AddCurrentPendingId(i, "Test");
                        String time = TimeItem.get(i);
                        int Position = time.indexOf(":");
                        int hour = Integer.parseInt(time.substring(0, Position));
                        int min = Integer.parseInt(time.substring(Position + 1));
                        Calendar cal = Calendar.getInstance();
                        cal.set(Calendar.HOUR_OF_DAY, hour);
                        cal.set(Calendar.MINUTE, min);
                        cal.set(Calendar.SECOND, 0);
                        cal.set(Calendar.MILLISECOND, 0);
                        am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
                                        pendingIntent);
                }
Codice (Java): [Seleziona]
 <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="it.asd.main.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service
            android:name="it.asd.service.ServiceNotification"
            android:enabled="true" >
        </service>

        <receiver android:name="it.asd.service.AlarmReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.USER_PRESENT" />
            </intent-filter>
        </receiver>
    </application>

PS: non voglio usare i servizi offerti da google(GCM).
Grazie

Offline xixietto

Re:Notifiche android con AlarmManager + BroadcastReceiver
« Risposta #1 il: 08 Dicembre 2015, 15:56:00 CET »
0
risolto?