2015-12-17 12 views
6

Pre API 19, il metodo go-to per l'aggiornamento di un widget più veloce del tempo updatePeriodMillis minimo di 30 minuti consisteva nell'utilizzare uno AlarmManager e un BroadcastReceiver per ricevere l'intenzione dopo la specifica intervallo utilizzato durante l'impostazione di AlarmManager.Aggiornamento di un widget a intervalli brevi utilizzando l'API 19+

Attualmente, utilizzando il codice riportato di seguito, il widget viene aggiornato, ma a partire da Android 5.1, utilizzando .setRepeating() con un intervallo di ripetizione inferiore a 60000ms avrà automaticamente l'intervallo impostato su almeno 60000 ms.

Impostazione allarme in Widget onEnabled():

AlarmManager am= (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); 
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 
//After after 3 seconds 
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+ 3000, 1000 , pi); 

poi nel del AlarmManagerBroadcastReceiver OnReceive():

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TAG"); 
//Acquire the lock 
wl.acquire(); 

/* 
* ...... 
* Update Widgets RemoteViews 
*/ 

wl.release(); 

nella documentazione per setRepeating() che dice:

Nota: a partire dall'API 19, tutti gli allarmi ripetuti sono inesatti. Se l'applicazione richiede tempi di consegna precisi, è necessario utilizzare allarmi esatti e una sola volta, riprogrammando ogni volta come descritto sopra. Le applicazioni legacy con targetSdkVersion precedente all'API 19 continueranno ad avere tutti i loro allarmi, compresi gli allarmi ripetuti, trattati come esatti.

anche ora afferma:

Schedule un allarme di ripetizione. Nota: per le operazioni di cronometraggio (zecche, timeout, ecc) è più facile e molto più efficiente di utilizzare Handler

Così come si va sulla aggiornamento delle Widgets Remoteviews utilizzando un gestore? Come faresti a smettere quando il dispositivo viene messo a dormire per risparmiare la batteria?

Esistono altri modi consigliati per aggiornare un widget?

+0

c'è qualche problema con la mia risposta? l'hai provato ? – csenga

risposta

2

Dal livello API 21 JobScheduler si consiglia di gestire questo tipo di aggiornamenti periodici.

Definire il lavoro in un JobService:

public class UpdateJob extends JobService { 

    public static int JOB_ID=9; 

    @Override 
    public boolean onStartJob(JobParameters params) { 
     Toast.makeText(getApplicationContext(),"update",Toast.LENGTH_SHORT).show(); 
     //call handler, create thread, asynctask etc 
     return false; 
    } 

    @Override 
    public boolean onStopJob(JobParameters params) { 
     return false; 
    } 
} 

registrarlo nel manifesto:

<service android:name=".UpdateJob" 
      android:permission="android.permission.BIND_JOB_SERVICE" /> 

Pianificare il processo e. g. in attività:

JobScheduler mJobScheduler = (JobScheduler) 
     getSystemService(Context.JOB_SCHEDULER_SERVICE); 

JobInfo.Builder builder = new JobInfo.Builder(UpdateJob.JOB_ID, 
new ComponentName(getApplicationContext(), UpdateJob.class) ); 

builder.setPeriodic(3000); // in every 3 sec 
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); // only when network is available 

if(mJobScheduler.schedule(builder.build()) <= 0) 
{ 
    //error, cant be scheduled 
} 

//later e.g. when update is disabled 
mJobScheduler.cancel(UpdateJob.JOB_ID); 

JobInfo.Builder ha un sacco di opzioni per personalizzare il vostro lavoro quando viene attivato per esempio può dipendere dalla rete e dallo stato del dispositivo.

Nelle API inferiori JobSchedulerCompat o GCM Network Manager possono essere utilizzate in alternativa a questo, funzionano entrambe nello stesso modo come mostrato sopra.

+ un altro

Per trattare con un BroadcastReceiver che acquisisce Wakelock v'è una classe "aiuto" nella libreria di supporto, WakefulBroadcastReceiver.

Problemi correlati