Autore Topic: Creazione servizio in background  (Letto 456 volte)

Offline Raffaele Stabile

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus ZenFone
  • Sistema operativo:
    Ubuntu 16.04
Creazione servizio in background
« il: 19 Aprile 2017, 17:46:47 CEST »
0
Salve a tutti. Vorrei creare un servizio/processo nella mia applicazione che da una notifica all'utente in una certa condizione, il controllo viene effettuato ogni 5 minuti. Ho provato ad utilizzare la classe Service e IntentService ma il problema è che quando l'app è chiusa o lo schermo si spegne non funziona più. Qualche consiglio? Grazie.

Offline iClaude

  • Utente normale
  • ***
  • Post: 243
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Creazione servizio in background
« Risposta #1 il: 19 Aprile 2017, 20:57:09 CEST »
0
Se devi solo eseguire un controllo ogni 5 minuti e basta, io utilizzerei un AlarmManager, tenendo conto che il metodo da usare varia a seconda della versione di Android, sia perchè sono cambiate le API nel tempo, sia perché da Android 6 bisogna anche tener conto di Doze.

Offline Raffaele Stabile

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus ZenFone
  • Sistema operativo:
    Ubuntu 16.04
Re:Creazione servizio in background
« Risposta #2 il: 20 Aprile 2017, 09:12:16 CEST »
0
Grazie, provo allora.  :-)

Post unito: 20 Aprile 2017, 14:21:43 CEST
Niente, anche con alarmManager quando lo schermo si spegne la notifica non viene lanciata. C'è qualche impostazione particolare da utilizzare?
« Ultima modifica: 20 Aprile 2017, 14:21:43 CEST da Raffaele Stabile, Reason: Merged DoublePost »

Offline iClaude

  • Utente normale
  • ***
  • Post: 243
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Creazione servizio in background
« Risposta #3 il: 21 Aprile 2017, 08:55:36 CEST »
0
Dovrebbe essere così.

Fino api 18:
setRepeating con WAKEUP

Api 19-22:
setExact con WAKEUP

Api 23+:
setExactAndAllowWhileIdle

Ps. Cmq lanciare un task ogni 5 minuti consuma la batteria (io non installerei mai un app che fa questo). Meglio usare JobScheduler.

Offline Raffaele Stabile

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus ZenFone
  • Sistema operativo:
    Ubuntu 16.04
Re:Creazione servizio in background
« Risposta #4 il: 24 Aprile 2017, 09:34:31 CEST »
0
Ti ringrazio, ma niente funziona solo quando l'app è attiva. Comunque va bene per ora lascio cosi!

Offline darkmax

  • Utente junior
  • **
  • Post: 63
  • Respect: 0
    • Mostra profilo
    • Emoe - Agenzia di comunicazione Torino
  • Dispositivo Android:
    Samsung Galaxy S 3
  • Sistema operativo:
    Mac OS X
Re:Creazione servizio in background
« Risposta #5 il: 25 Aprile 2017, 22:48:17 CEST »
0
seguo

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 716
  • Respect: +151
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Creazione servizio in background
« Risposta #6 il: 26 Aprile 2017, 15:47:48 CEST »
+1
E' possibile usare il FireBase Job dispatcher.

Prerequisito: aggiungere

Codice: [Seleziona]
compile 'com.firebase:firebase-jobdispatcher:0.5.0'
in build.gradle, sotto "dependencies", quindi il job può essere schedulato con:

Codice (Java): [Seleziona]
        Driver driver = new GooglePlayDriver(context);
        FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(driver);
        Job myJob = dispatcher.newJobBuilder()
                /* La classe che svolge il lavoro */
                /* Deve estendere com.firebase.jobdispatcher.JobService */
                .setService(MyJobService.class)
                /* Deve essere una stringa univoca per identificare il Job */
                .setTag("my-job-service-01")
                /*
                 * Indica che il job deve essere eseguito con qualsiasi in connettività
                 * di qualsiasi tipo
                 */

                .setConstraints(Constraint.ON_ANY_NETWORK)
                /*
                 * Indica che il Job viene eseguito anche dopo il riavvio.
                 */

                .setLifetime(Lifetime.FOREVER)
                /*
                 * Indica che il Job va eseguito più volte.
                 */

                .setRecurring(true)
                /*
                 * Indica una finestra di esecuzione.
                 * Il tempo è indicato in secondi.
                 * Si indicano due valori per permettere allo scheduler di eseguire i Job in modo
                 * ottimizzato per ridurre il consumo di batteria.
                 * Il primo valore indica ogni quanto tempo minimo va eseguito il job, il secondo valore
                 * indica il tempo massimo.
                 * In pratica indicando "10, 20" significa "esegui il job non prima di 10 secondi dal precedente
                 * ma non dopo 20 secondi dal precedente", quindi il job verrà eseguito da 10 a 20 secondi dopo l'ultima
                 * esecuzione.
                 */

                .setTrigger(Trigger.executionWindow(
                        5*60, //5 minuti
                        (5*60) + (2*60) //7 minuti
                        ))
                /*
                 * Indica che se il Job è già schedulato, questa richiesta sostituisce la precedente
                 */

                .setReplaceCurrent(true)
                /* Crea l'istanza di "Job" */
                .build();

        /* Schedula il job */
        dispatcher.schedule(myJob);
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Raffaele Stabile

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus ZenFone
  • Sistema operativo:
    Ubuntu 16.04
Re:Creazione servizio in background
« Risposta #7 il: 28 Aprile 2017, 15:17:09 CEST »
0
Grazie, appena riesco proverò.

Offline iClaude

  • Utente normale
  • ***
  • Post: 243
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Creazione servizio in background
« Risposta #8 il: 02 Maggio 2017, 21:00:47 CEST »
0
E' possibile usare il FireBase Job dispatcher.

Prerequisito: aggiungere

Codice: [Seleziona]
compile 'com.firebase:firebase-jobdispatcher:0.5.0'
in build.gradle, sotto "dependencies", quindi il job può essere schedulato con:

Codice (Java): [Seleziona]
        Driver driver = new GooglePlayDriver(context);
        FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(driver);
        Job myJob = dispatcher.newJobBuilder()
                /* La classe che svolge il lavoro */
                /* Deve estendere com.firebase.jobdispatcher.JobService */
                .setService(MyJobService.class)
                /* Deve essere una stringa univoca per identificare il Job */
                .setTag("my-job-service-01")
                /*
                 * Indica che il job deve essere eseguito con qualsiasi in connettività
                 * di qualsiasi tipo
                 */

                .setConstraints(Constraint.ON_ANY_NETWORK)
                /*
                 * Indica che il Job viene eseguito anche dopo il riavvio.
                 */

                .setLifetime(Lifetime.FOREVER)
                /*
                 * Indica che il Job va eseguito più volte.
                 */

                .setRecurring(true)
                /*
                 * Indica una finestra di esecuzione.
                 * Il tempo è indicato in secondi.
                 * Si indicano due valori per permettere allo scheduler di eseguire i Job in modo
                 * ottimizzato per ridurre il consumo di batteria.
                 * Il primo valore indica ogni quanto tempo minimo va eseguito il job, il secondo valore
                 * indica il tempo massimo.
                 * In pratica indicando "10, 20" significa "esegui il job non prima di 10 secondi dal precedente
                 * ma non dopo 20 secondi dal precedente", quindi il job verrà eseguito da 10 a 20 secondi dopo l'ultima
                 * esecuzione.
                 */

                .setTrigger(Trigger.executionWindow(
                        5*60, //5 minuti
                        (5*60) + (2*60) //7 minuti
                        ))
                /*
                 * Indica che se il Job è già schedulato, questa richiesta sostituisce la precedente
                 */

                .setReplaceCurrent(true)
                /* Crea l'istanza di "Job" */
                .build();

        /* Schedula il job */
        dispatcher.schedule(myJob);

Credo però che questa soluzione non funzioni con Doze attivo, ovvero deve rispettare le mantainance windows di Doze.
Correggimi se sbaglio.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Creazione servizio in background
« Risposta #9 il: 03 Maggio 2017, 09:50:01 CEST »
0
Spettacolo. Non pensavo che firebase avesse questa funzionalità lato client. pensavo che questi job fossero qualcosa lato console e basta

Offline Raffaele Stabile

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus ZenFone
  • Sistema operativo:
    Ubuntu 16.04
Re:Creazione servizio in background
« Risposta #10 il: 06 Giugno 2017, 17:43:37 CEST »
0
Grandissimo!!!! Finalmente ho provato e funziona!!!!