Autore Topic: AlarmManager con notifica  (Letto 1640 volte)

Offline xixietto

AlarmManager con notifica
« il: 29 Ottobre 2015, 17:24:36 CET »
0
ho provato a creare un allarme che a un orario tot.. mi invii una notifica..
sapete dirmi perchè non succede nulla?
l'orario per fare una prova l'ho impostato a 15 secondi... quindi l'app ogni 15 sec dovrebbe inviarmi una notifica..
Codice (Java): [Seleziona]
public class Sveglia extends AppCompatActivity {
    [MENTION=567222]Override[/MENTION]
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sveglia);

        Intent notificationIntent = new Intent(getBaseContext(), ShowNotification.class);
        PendingIntent contentIntent = PendingIntent.getService(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(contentIntent);
        int tipoAllarme = AlarmManager.ELAPSED_REALTIME_WAKEUP;
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 00); // For 1 PM or 2 PM
        calendar.set(Calendar.MINUTE, 00);
        calendar.set(Calendar.SECOND, 15);
        long OrarioAllarme = calendar.getTimeInMillis();
        alarmManager.setRepeating(tipoAllarme,OrarioAllarme,OrarioAllarme, contentIntent);

    }
}

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

    private final static String TAG = "ShowNotification";

    [MENTION=567222]Override[/MENTION]
    public void onCreate() {
        super.onCreate();

        Intent mainIntent = new Intent(this, Sveglia.class);

        NotificationManager notificationManager
                = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

        Notification noti = new Notification.Builder(this)
                .setAutoCancel(true)
                .setContentIntent(PendingIntent.getActivity(this, 0, mainIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT))
                .setContentTitle("Contatore Helper")
                .setContentText("Ti ricordo di aggiornare il contatore")
                .setDefaults(Notification.DEFAULT_ALL)
                .setSmallIcon(R.drawable.ic_launcher)
                .setTicker("Contatore Helper")
                .setWhen(System.currentTimeMillis())
                .setDefaults(Notification.DEFAULT_SOUND
                        | Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE)

                .build();

        notificationManager.notify(0, noti);

        Log.i(TAG, "Notification created");
    }

    [MENTION=567222]Override[/MENTION]
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
}

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:AlarmManager con notifica
« Risposta #1 il: 02 Dicembre 2015, 16:26:53 CET »
0
Qui vedo almeno due problemi.
setRepeating va chiamato con il secondo parametro come ora dell'allarme.

Prova a mettere
Codice (Java): [Seleziona]
 alarmManager.setRepeating(tipoAllarme, SystemClock.elapsedRealtime() + 15000,15000, contentIntent);

Secondo problema:
L'AlarmManager ti manda una startService al tuo servizio.
Che va gestita nella onStartCommand

la onCreate viene chiamata alla creazione del servizio. Se il servizio non chiama la stopSelf, non viene mai fermato (a meno di necessità di RAM)

Sposta la notifica nelle onStartCommand e vedrai che funziona.

Ciao.
« Ultima modifica: 03 Dicembre 2015, 12:02:28 CET da arlabs »

Offline xixietto

Re:AlarmManager con notifica
« Risposta #2 il: 02 Dicembre 2015, 16:59:19 CET »
0
Io francamente non ho capito bene l'uso di questo allarm  manager.. Io in pratica vorrei creare una "sveglia". Cioè creare vari allarm manager con diversi orari e allo scoccare delle ore impostate, ricevere una notifica. Ma non ho capito come fare.. E se dv usare un DB SQLite.. Spero in un aiuto

Inviato dal mio GT-I9505 utilizzando Tapatalk


Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:AlarmManager con notifica
« Risposta #3 il: 03 Dicembre 2015, 12:04:13 CET »
0
Guarda hai fatto "abbastanza" giusto.

Semplicemente, come ti ho scritto prima... l'AlarmManager richiede l'ora della sveglia, non la differenza di tempo rispetto ad ora.

Ed il service deve gestire le cose nella onStartCommand, non nella onCreate.


Offline xixietto

Re:AlarmManager con notifica
« Risposta #4 il: 03 Dicembre 2015, 14:33:42 CET »
0
Ciao, ho sostituito il setRepeation come hai consigliato. Ma ora come si crea il secondo punto da te citato?
E oltre a questo, in caso volessi inserire più allarmi? Cioè l utente scrive l'ora e la data di diversi allarmi.. Tipo come una sveglia..dovrei inserirli in un DB SQLite? E come verranno gestiti?
Scusami ma è la prima volta che uso questo tipo di funzione. Spero in un aiuto
« Ultima modifica: 03 Dicembre 2015, 22:44:51 CET da xixietto »

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:AlarmManager con notifica
« Risposta #5 il: 04 Dicembre 2015, 10:30:06 CET »
0
Imposti un allarme per ogni sveglia.
Il problema è che gli allarmi vengono cancellati quando si riavvia il telefono, per cui è necessario pensare a qualche sistema di memorizzazione, oltre che far partire un Service per reimpostare gli allarmi ad ogni accensione del telefono.

Offline xixietto

Re:AlarmManager con notifica
« Risposta #6 il: 04 Dicembre 2015, 10:52:55 CET »
0
Un DB SQLite no?

Inviato dal mio GT-I9505 utilizzando Tapatalk


Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:AlarmManager con notifica
« Risposta #7 il: 04 Dicembre 2015, 10:55:29 CET »
0
Un DB SQLite no?

Inviato dal mio GT-I9505 utilizzando Tapatalk

Certo,  come sistema di memorizzazione può andare bene.

Offline xixietto

Re:AlarmManager con notifica
« Risposta #8 il: 04 Dicembre 2015, 11:03:38 CET »
0
Ma come si gestisce ? Cioè parte Tipo un timer? Non ho capito cm funziona sinceramente.. In forma di codice.. Avete qualche esempio?

Inviato dal mio GT-I9505 utilizzando Tapatalk


Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:AlarmManager con notifica
« Risposta #9 il: 04 Dicembre 2015, 15:25:32 CET »
0
Ciao, ho sostituito il setRepeation come hai consigliato. Ma ora come si crea il secondo punto da te citato?

Se vuoi usare un Service ti conviene avere un idea di come funziona. Leggiti questo http://developer.android.com/guide/components/services.html
Ci trovi anche pezzi di codice ad esempio

Per riprogrammarli al riavvio metti un BroacastReceiver ad "android.intent.action.BOOT_COMPLETED"


Offline xixietto

Re:AlarmManager con notifica
« Risposta #10 il: 04 Dicembre 2015, 15:54:06 CET »
0
questo è il mio stato attuale
ho una classe sveglia
Codice (Java): [Seleziona]
public class Sveglia extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sveglia);

        Intent notificationIntent = new Intent(getBaseContext(), ShowNotification.class);
        PendingIntent contentIntent = PendingIntent.getService(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(contentIntent);
        int tipoAllarme = AlarmManager.ELAPSED_REALTIME_WAKEUP;
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 00); // For 1 PM or 2 PM
        calendar.set(Calendar.MINUTE, 00);
        calendar.set(Calendar.SECOND, 15);
        long OrarioAllarme = calendar.getTimeInMillis();
        alarmManager.setRepeating(tipoAllarme, SystemClock.elapsedRealtime() + 15000,15000, contentIntent);



    }
}
è una classe ShowNotification
Codice (Java): [Seleziona]
public class ShowNotification extends Service {

    private final static String TAG = "ShowNotification";


       @Override
       public int onStartCommand(Intent intent, int flags, int startId) {
        Intent mainIntent = new Intent(this, Sveglia.class);

        NotificationManager notificationManager
                = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

        Notification noti = new Notification.Builder(this)
                .setAutoCancel(true)
                .setContentIntent(PendingIntent.getActivity(this, 0, mainIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT))
                .setContentTitle("Contatore Helper")
                .setContentText("Ti ricordo di aggiornare il contatore")
                .setDefaults(Notification.DEFAULT_ALL)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setTicker("Contatore Helper")
                .setWhen(System.currentTimeMillis())
                .setDefaults(Notification.DEFAULT_SOUND
                        | Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE)

                .build();

        notificationManager.notify(0, noti);

        Log.i(TAG, "Notification created");
           return START_STICKY;

    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
}
ricevuto le notifiche dopo 15 secondi..
come procedere?
Come bloccare il service?
Ho notato che se spengo il cellulare il service non funziona più
« Ultima modifica: 04 Dicembre 2015, 19:23:50 CET da xixietto »

Offline xixietto

Re:AlarmManager con notifica
« Risposta #11 il: 07 Dicembre 2015, 09:21:27 CET »
0
Sapete come gestire più allarm manager? Usando un SQLite per segnare le ore e i giorni? Help!! Non ho proprio idee

Inviato dal mio GT-I9505 utilizzando Tapatalk


Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:AlarmManager con notifica
« Risposta #12 il: 07 Dicembre 2015, 18:16:33 CET »
0
Come bloccare il service?
c'è il metodo stopSelf (http://developer.android.com/reference/android/app/Service.html#stopSelf())

Ho notato che se spengo il cellulare il service non funziona più

Sì, infatti, al riavvio dovresti riprogrammare gli allarmi. Ti avevo consigliato di registrarti un BroadcastReceiver ad "android.intent.action.BOOT_COMPLETED".

Ciao.

Offline xixietto

Re:AlarmManager con notifica
« Risposta #13 il: 07 Dicembre 2015, 19:25:58 CET »
0
Ciao come sto procedendo?
Codice (Java): [Seleziona]
public class Sveglia extends AppCompatActivity {
    private Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sveglia);

        Button btnHome=(Button)findViewById(R.id.button2);
        btnHome.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                stopService()  ;       cosa devo inserire qui????????????????????????

            }
        });

            this.context = this;
            Intent alarm = new Intent(this.context, Broadcast.class);
            boolean alarmRunning = (PendingIntent.getBroadcast(this.context, 0, alarm, PendingIntent.FLAG_NO_CREATE) != null);
            if(alarmRunning == false) {
                PendingIntent pendingIntent = PendingIntent.getBroadcast(this.context, 0, alarm, 0);
                AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 5000, pendingIntent);
                Log.d("numero", String.valueOf(SystemClock.elapsedRealtime()));//non funziona bene  prende un'altra posizione

            }
        }

    }

Codice (Java): [Seleziona]
public class Broadcast extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent background = new Intent(context, ShowNotification.class);
        context.startService(background);
    }

}

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

    private final static String TAG = "ShowNotification";


       @Override
       public int onStartCommand(Intent intent, int flags, int startId) {
        Intent mainIntent = new Intent(this, Sveglia.class);

        NotificationManager notificationManager
                = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

        Notification noti = new Notification.Builder(this)
                .setAutoCancel(true)
                .setContentIntent(PendingIntent.getActivity(this, 0, mainIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT))
                .setContentTitle("Contatore Helper")
                .setContentText("Ti ricordo di aggiornare il contatore")
                .setDefaults(Notification.DEFAULT_ALL)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setTicker("Contatore Helper")
                .setWhen(System.currentTimeMillis())
                .setDefaults(Notification.DEFAULT_SOUND
                        | Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE)

                .build();

        notificationManager.notify(0, noti);

        Log.i(TAG, "Notification created");
           return START_STICKY;
       }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
}

Codice (Java): [Seleziona]
   <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <receiver android:name=".Broadcast" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>
        </receiver>
        <activity
            android:name=".Sveglia"
            android:label="allarme"
            android:theme="@style/AppTheme">
        </activity>
        <service android:name=".ShowNotification" />
        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>
« Ultima modifica: 08 Dicembre 2015, 16:24:38 CET da xixietto »

Offline xixietto

Re:AlarmManager con notifica
« Risposta #14 il: 09 Dicembre 2015, 14:56:03 CET »
0
Nessuno sa come gestire più alarm manager? Cmq non sto riuscendo a fermate l allarme

Inviato dal mio GT-I9505 utilizzando Tapatalk