这是我正在处理的事情。
我有一个与我的Android应用程序关联的小部件,我想每10分钟更新一次(目前使用AlarmManager),只有在屏幕打开时。如果屏幕关闭,则pendingIntent的警报将被取消。一旦屏幕再次打开,我检查上次更新和当前时间是否有10分钟或更长时间,如果是,我发送广播来更新小部件。
发生了什么,问题是挂起的Intent的警报可能没有被取消(可能),并且对屏幕关闭时堆叠的pendingIntent的所有警报执行小部件更新。
以下是一些代码段。
@Override
public void onReceive(Context context, Intent intent) {
check_intent = intent.getAction();
if(check_intent.equals("android.appwidget.action.APPWIDGET_UPDATE")){
mAppPreferences = PreferenceManager.getDefaultSharedPreferences(context);
int saved_num_widgets = mAppPreferences.getInt(NUM_WIDGETS, 0);
/*Check if there is atleast one widget on homescreen*/
if (saved_num_widgets>0){
boolean check = CheckScreenOn.check_screen_on(context);
/*Check if Screen is ON*/
if(check == true){
Intent widgetUpdate = new Intent(context, MyWidget.class);
widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
alarms = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
newPending = PendingIntent.getBroadcast(context, 0, widgetUpdate,0);
alarms.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime()+ PERIOD, newPending);
context.startService(new Intent(context, UpdateService.class));
}
else{
alarms.cancel(newPending);
/*Screen is OFF no point updating the widget, cancel Alarms and do nothing*/
}
}
else{
int duration = Toast.LENGTH_LONG;
CharSequence text = "Please place My Widget on your home screen to keep earning money.";
Toast toast = Toast.makeText(context, text, duration);
toast.show();
}
}
if(check_intent.equals("android.appwidget.action.APPWIDGET_ENABLED")){
this.onEnabled(context);
}
if(check_intent.equals("android.appwidget.action.APPWIDGET_DELETED")){
this.onDeleted(context);
}
if(check_intent.equals("android.appwidget.action.APPWIDGET_DISABLED")){
this.onDisabled(context);
}
}
这是接收SCREEN_ON广播的BroadcastReceiver,如果当前时间 - 上次小部件更新> = 10分钟,则发送小部件更新请求。
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// ...
long update_interval = mAppPreferences.getLong(LASTUPDATETIME, 0);
long curtimemillis = System.currentTimeMillis();
long calculate_interval = curtimemillis - update_interval;
if(calculate_interval >= PERIOD){
int saved_num_widgets = mAppPreferences.getInt(NUM_WIDGETS, 0);
if (saved_num_widgets>0){
alarms.cancel(newPending);
Intent widgetUpdate = new Intent(context, MyWidget.class);
widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
context.sendBroadcast(widgetUpdate);
}
}
}
}, new IntentFilter(Intent.ACTION_SCREEN_ON));
让我们说最后一次更新发生在上午10:00,屏幕关闭了30分钟。当屏幕亮起时,窗口小部件会立即更新为pendingIntent存储的所有警报。我希望小部件更新只在屏幕再次亮起时发生一次。
最初我明白,当设备从空闲状态唤醒时,会触发AlarmManager.ELAPSED_REALTIME。
我不知道为什么警报取消不起作用。其他一切都按预期工作。
顺便说一句,我已经对各种设备上的10分钟小部件更新进行了性能测试,但这并不是对可用资源的压力。此外,所提供的服务甚至不会出现在Android设备的电池使用显示器中。
非常感谢任何帮助。
答案 0 :(得分:0)
我也见过这个。将其更改为使用接收SCREEN_OFF或SCREEN_ON的广播接收器并手动停止/启动警报服务。
不是你可能想要抱歉的答案: - )