使用API​​ 19+以较短的间隔更新Widget

时间:2015-12-17 01:57:08

标签: android android-widget android-handler

Pre API 19,更新Widget的时间超过updatePeriodMillis最短时间30分钟的方法是使用AlarmManagerBroadcastReceiver来接收意图后的意图设置AlarmManager时使用的指定间隔。

目前,使用以下代码,Widget会更新,但从Android 5.1开始,使用重复间隔小于60000ms的.setRepeating()会自动将其间隔设置为至少60000ms。

在小部件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);

然后在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();

setRepeating()的文档中,它说:

  

注意:从API 19开始,所有重复警报都不准确。如果您的应用程序需要精确的交付时间,那么它必须使用一次性精确警报,每次重新安排如上所述。 targetSdkVersion早于API 19的旧应用程序将继续将所有警报(包括重复警报)视为完全警报。

它现在也说明了:

  

安排重复闹钟。注意:对于计时操作(刻度,超时等),使用Handler

更容易,效率更高

那么您将如何使用处理程序更新Widgets Remoteviews?当设备进入睡眠状态以节省电池时,您会如何停止它?

是否还有其他建议的方法来更新Widget?

1 个答案:

答案 0 :(得分:4)

从API级别21 JobScheduler建议处理这类定期更新。

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;
    }
}

在清单中注册:

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

安排工作e。 G。在活动中:

 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有很多选项可以在您的工作被触发时自定义,例如它可以依赖于网络和设备状态。

在较低的API上JobSchedulerCompatGCM Network Manager可用作替代方案,它们的工作方式与上面显示的方式非常相似。

+再一次

对于处理获取唤醒锁的BroadcastReceiver,有一个&#34;帮助&#34;支持库中的类WakefulBroadcastReceiver