Autore Topic: Soluzione ottimale per la realizzazione di app widget batteria  (Letto 748 volte)

Offline Splact

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: +1
    • Google+
    • https://www.linkedin.com/profile/view?id=78185089
    • Splact
    • Mostra profilo
    • Splact.com
  • Dispositivo Android:
    One Plus One
  • Play Store ID:
    Dario Carella
  • Sistema operativo:
    Windows 8 64bit
Soluzione ottimale per la realizzazione di app widget batteria
« il: 07 Dicembre 2012, 17:51:08 CET »
0
Come da titolo sono alla ricerca della soluzione ottimale per la realizzazione di un widget batteria. Per ottimale intendo che non prosciughi la batteria, ma che sia cmq costantemente sincronizzato con il valore di sistema.

Il mio approccio
Ho registrato l'appwidget provider come broadcastreceiver per ricevere appunto gli intent di cambio stato della batteria.
Codice (Java): [Seleziona]
IntentFilter batteryFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
context.getApplicationContext().registerReceiver(this, batteryFilter);
Ho gestito questo tipo di Intent nel onReceive.
Codice (Java): [Seleziona]
@Override
public void onReceive(Context context, Intent intent) {
        Log.i(LOG_TAG, "onReceive: " + intent);
       
        String action = intent.getAction();

        if (action.equals(AppWidgetManager.ACTION_APPWIDGET_UPDATE)) {

                ...

        } else if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {

                updateWidget(context, intent);

        }
}
Nel file xml di widget info ho settato il tempo di aggiornamento pari a 0, poiché per efficienza voglio appunto che si aggiorni solo se strettamente necessario.
Codice (XML): [Seleziona]
android:updatePeriodMillis="0"Fin qui tutto ok, il widget funziona correttamente, si inizializza ed è sincronizzato con i valori di sistema. Il problema sorge in un tempo successivo (può capitare dopo un ora come dopo 1 min), poiché il sistema ha bisogno di memoria mi killa il processo mostrandomi: "Process com.my.app (pid 55555) has died.". Da questo momento in poi il widget non è più sincronizzato.
Ho provato anche una variante in cui realizzavo un broadcastreceiver esterno inizializzato nel manifest della mia applicazione, dedicato solo al cambiamento di stato della batteria, tuttavia scopro che questo tipo di intent rientra in una categoria di intent protected i quali non possono essere registrati nel manifest.

Ho considerato (non provato) l'utilizzo di un service, tuttavia immagino (leggo in giro voci dello stesso parere) che sia una tecnica da evitare per un widget, la quale causerebbe un eccessivo consumo di energia.

Vi ringrazio in anticipo,
Dario