2015-12-17 11 views
6

Pre API 19, die Go-to-Methode zum Aktualisieren eines Widgets schneller als die updatePeriodMillis Mindestzeit von 30 Minuten war eine AlarmManager und eine BroadcastReceiver, um die Absicht nach dem angegebenen zu erhalten Intervall, das beim Einrichten des AlarmManagers verwendet wird.Aktualisieren eines Widgets in kurzen Intervallen mit API 19+

Derzeit den Code unten verwenden, wird das Widget aktualisiert, sondern als von Android 5.1, mit .setRepeating() mit einem Wiederholungsintervall von weniger als 60000ms automatisch das Intervall auf mindestens 60000ms gesetzt haben.

Einstellung Alarm in Widgets 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); 

dann in der AlarmManagerBroadcastReceiver des 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(); 

In der Dokumentation für setRepeating() heißt es:

Hinweis: Ab API 19 sind alle Wiederholungsalarme ungenau. Wenn Ihre Anwendung genaue Lieferzeiten benötigt, muss sie einmalige exakte Alarme verwenden, die wie oben beschrieben jedes Mal neu geplant werden. Ältere Anwendungen, deren targetSdkVersion älter als API 19 ist, werden weiterhin alle ihre Alarme, einschließlich der Wiederholung von Alarmen, als genau behandelt behandeln.

heißt es auch jetzt:

vereinbaren, zu wiederkehrenden Alarm. Hinweis: für Operationen Timing (Zecken, Timeouts, etc.) ist es einfacher und viel effizienter Handler

So zu verwenden, wie würden Sie gehen über die Widgets Remoteviews Aktualisieren eines Handler verwenden? Wie würdest du es stoppen, wenn das Gerät eingeschläfert wird, um die Batterie zu schonen?

Gibt es andere Wege vorgeschlagen, um ein Widget zu aktualisieren?

+0

Gibt es ein Problem mit meiner Antwort? Hast du es versucht ? – csenga

Antwort

2

Von API-Ebene 21 JobScheduler wird empfohlen, diese Art von regelmäßigen Updates zu behandeln.

Definieren Sie den Job in einem 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; 
    } 
} 

es im Manifest registrieren:

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

Planen Sie den Job e. G. in einer Aktivität:

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 hat viele Optionen anpassen, wenn der Auftrag zum Beispiel ausgelöst wird Dies kann vom Netzwerk- und Gerätezustand abhängen.

Auf niedrigeren APIs JobSchedulerCompat oder GCM Network Manager kann als eine Alternative zu diesem verwendet werden, sie beide funktionieren ziemlich genau so wie oben gezeigt.

+ ein weiteres

Für mit einem BroadcastReceiver zu tun, die WakeLock erwirbt gibt es eine "Helfer" Klasse in der Support-Bibliothek, WakefulBroadcastReceiver.