Autore Topic: Problema Background service con Oreo  (Letto 323 volte)

Offline morriluca

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia Play
  • Sistema operativo:
    Windows xp
Problema Background service con Oreo
« il: 03 Febbraio 2018, 18:25:42 CET »
0
Buongiorno, ho creato un'app che deve costantemente ricevere da un web service le previsioni metereologiche di alcune centraline.
Ho creato un servizio sempre attivo che si occupa di recuperare queste informazioni.
Funziona tutto correttamente, con android 8.0 il sistema non funziona..
Con Oreo non funziona la seguente istruzione
Codice (Java): [Seleziona]
Intent intent = new Intent("com.morriluca.pigsforecast.END_CHECK_SERVICE");  sendBroadcast(intent);che mi permette di mantenere sempre attivo il servizio.
Ricevo inoltre il seguente codice di errore:
Codice (Java): [Seleziona]
W/BroadcastQueue: Background execution not allowed: receiving Intent { act=com.morriluca.pigsforecast.END_CHECK_SERVICE flg=0x10 } to com.morriluca.pigsforecast/.StartupVi posto il codice

Codice (Java): [Seleziona]
public class Startup extends BroadcastReceiver {
    public Startup(){
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
            context.startForegroundService(new Intent(context, CheckPrevisioniService.class));
        } else {
            context.startService(new Intent(context, CheckPrevisioniService.class));
        }
    }
}

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


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        in_azione = false;
        super.onStartCommand(intent, flags, startId);
        startTimer();
        return START_STICKY;
    }

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



    public void startTimer() {
        mTimer = new Timer();
        initializeTimerTask();
        tempo= 30;        
        mTimer.schedule(timerTask, tempo*1000, tempo*1000);
    }


    public void initializeTimerTask() {
        timerTask = new TimerTask() {
            public void run() {
                try {                  
                   cercaPrevisioni();                  
                }catch (Exception e){                  
                }
            }
        };
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        Intent intent = new Intent("com.morriluca.pigsforecast.END_CHECK_SERVICE");
        sendBroadcast(intent);

    }




    public void cercaPrevisioni(){
        ....
    }


Codice (Java): [Seleziona]
<service
            android:name=".CheckPrevisioniService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:exported="false" />

        <receiver
            android:name=".Startup">

            <!-- This intent filter receives the boot completed event -->
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="com.morriluca.pigsforecast.END_CHECK_SERVICE" />
            </intent-filter>
        </receiver>

















Offline berpao

  • Utente normale
  • ***
  • Post: 160
  • Respect: +20
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Problema Background service con Oreo
« Risposta #1 il: 05 Febbraio 2018, 08:19:06 CET »
0
Ciao, non sono un esperto di background service quindi ti attacco un link ad un articolo dove spiega il tuo problema (che a quanto pare sono limitazioni inserite in android oreo) e qualche soluzione da quello che ho visto. E' in inglese, ma mi sembra facilmente comprensibile.
Ciao
P

https://medium.com/exploring-android/exploring-background-execution-limits-on-android-oreo-ab384762a66c

Offline morriluca

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia Play
  • Sistema operativo:
    Windows xp
Re:Problema Background service con Oreo
« Risposta #2 il: 28 Febbraio 2018, 18:52:41 CET »
0
Ciao a tutti,
Ho risolto il problema, a chi interessa posto la soluzione.
Da android 8 e versioni successive hanno modificato la gestione dei processi in background, i quali consumano risorse e batteria al dispositivo.
Le classiche app, come facebook, whatsapp ecc...  usano questo servizio https://firebase.google.com/, il quale è uno dei pochi concesso
(io penso che sia una tipo di soket, ovvero che non ci sia un servizio di polling che controlla ogni tanto se ci sono nuovi messaggio, ma il è server stesso che risveglia il servizio all'arrivo di un messaggio).

Non utilizzando questo servizio ho risolto così.
Nella classe MyService che estende Service (il servizio in background che lancio) basta aggiungere questo codice
Codice (Java): [Seleziona]
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
    startForeground(100, new NotificationCompat.Builder(this, cannel_id_foreground).build());
}
In questa maniera su android 8 viene visualizzata una notifica di sistema (la quale si può disabilitare) la quale avverte di un processo in backgroud che consuma batteria, ma ti permette di tenere attivo il processo.

Per la seguente istruzione
Codice (Java): [Seleziona]
Intent intent = new Intent("com.morriluca.pigsforecast.END_CHECK_SERVICE"); In android 8 non sono riuscito a trovare una soluzione, in quanto non sono supportati gli intent-filter personalizzati.
HO risolto così, nel metodo Destroy della mia classe che estende Service ho messo questo codice
Codice (Java): [Seleziona]
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
     try {
         Intent intent2 = new Intent(this, MyService.class);
         startService(intent2);
     }catch (Exception e){}
} else {
     Intent intent = new Intent("com.morriluca.pigsforecast.END_CHECK_SERVICE");
     sendBroadcast(intent);
}