Android 使用API 19+;以短时间间隔更新小部件;

Android 使用API 19+;以短时间间隔更新小部件;,android,android-widget,android-handler,Android,Android Widget,Android Handler,在API 19之前,更新小部件的go-to方法比updatePeriodMillis最短30分钟的时间快,即使用AlarmManager和BroadcastReceiver在设置AlarmManager时使用的指定间隔后接收意图 目前,使用下面的代码,小部件会被更新,但从Android 5.1开始,使用重复间隔小于60000ms的.setRepeating()将自动将其间隔设置为至少60000ms 在小部件onEnabled()中设置报警: 然后在AlarmManagerBroadcastRec

在API 19之前,更新小部件的go-to方法比
updatePeriodMillis
最短30分钟的时间快,即使用
AlarmManager
BroadcastReceiver
在设置AlarmManager时使用的指定间隔后接收意图

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

在小部件onEnabled()中设置报警:

然后在AlarmManagerBroadcastReceiver的onReceive()中:

它的文档中说:

注:自API 19起,所有重复报警均不准确。如果您的应用程序需要精确的交付时间,那么它必须使用一次性精确警报,并按上述方式重新安排每次的时间。targetSdkVersion早于API 19的传统应用程序将继续将其所有报警(包括重复报警)视为精确报警

它现在还指出:

安排重复警报。注意:对于计时操作(滴答声、超时等),使用
处理程序

那么,您将如何使用处理程序更新小部件RemoteView呢?当设备处于休眠状态以节省电池电量时,您如何使其停止

是否有其他建议的方法来更新小部件?

建议使用API level 21来处理此类定期更新

以以下方式定义作业:

在舱单中注册:

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

安排工作时间。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(60 * 60 * 1000); // every hour
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);
JobScheduler=(作业调度器)
getSystemService(Context.JOB\u SCHEDULER\u服务);
JobInfo.Builder=新的JobInfo.Builder(UpdateJob.JOB\u ID,
新组件名(getApplicationContext(),UpdateJob.class));
builder.setPeriodic(60*60*1000);//每小时
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);//仅当网络可用时

if(mJobScheduler.schedule(builder.build())我的答案有什么问题吗?你试过了吗?它不接受3秒钟:
W/JobInfo:job179请求的间隔+3s0ms太小;job179请求的flex+3s0ms太小;提升到+5m0s0ms
。是否有办法取消此限制,至少出于测试目的?否,这些被覆盖在这种情况下,通过不可更改的值:
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" />
 JobScheduler mJobScheduler = (JobScheduler)
        getSystemService(Context.JOB_SCHEDULER_SERVICE);

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

builder.setPeriodic(60 * 60 * 1000); // every hour
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);