android-widget AlarmManager重复太快
我有一个显示数据使用情况的小部件,为此我创建了一个PreferenceActivity,用户可以从各种更新频率中进行选择。。 我从SharedReferences中获取所选的频率值,然后启动警报,但得到的结果很奇怪。这是我的AppWidgetProvider:android-widget AlarmManager重复太快,android,android-widget,alarmmanager,Android,Android Widget,Alarmmanager,我有一个显示数据使用情况的小部件,为此我创建了一个PreferenceActivity,用户可以从各种更新频率中进行选择。。 我从SharedReferences中获取所选的频率值,然后启动警报,但得到的结果很奇怪。这是我的AppWidgetProvider: private static PendingIntent pendingIntent = null; ... public void onReceive(Context context, Intent intent) { Log.
private static PendingIntent pendingIntent = null;
...
public void onReceive(Context context, Intent intent) {
Log.d("TAG", "receive");
super.onReceive(context, intent);
if (CLOCK_WIDGET_UPDATE.equals(intent.getAction())) {
ComponentName thisAppWidget = new ComponentName(context.getPackageName(), getClass().getName());
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);
for (int appWidgetID : ids) {
updateAppWidget(context, appWidgetManager, appWidgetID);
}
}
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Log.d("TAG", "update");
super.onUpdate(context, appWidgetManager, appWidgetIds);
for (int i = 0; i < appWidgetIds.length; i++) {
int appWidgetId = appWidgetIds[i];
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}
public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
// starting timer
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
Intent intent = new Intent(CLOCK_WIDGET_UPDATE);
pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
SharedPreferences prefs = context.getSharedPreferences(Integer.toString(appWidgetId), Context.MODE_PRIVATE);
int updateFrequencyMin = Integer.parseInt(prefs.getString(KEY_UPDATE_FREQ, DEFAULT_UPDATE_FREQ));
Log.d("TAG", "Update freq: " + updateFrequencyMin);
long updateFrequencyMillis = updateFrequencyMin * 60 * 1000;
// alarmManager.cancel(pendingIntent);
alarmManager.setInexactRepeating(AlarmManager.RTC, System.currentTimeMillis(), updateFrequencyMillis,
pendingIntent);
....
appWidgetManager.updateAppWidget(appWidgetId, view);
}
public void onDisabled(Context context) {
AlarmManager m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
m.cancel(pendingIntent);
}
最后,这是我的首选活动:
public class DataStatWidgetConfigure extends PreferenceActivity {
private int widgetId;
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle extras = getIntent().getExtras();
if (extras != null) {
widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
Log.d("meeegy", Integer.toString(widgetId));
getPreferenceManager().setSharedPreferencesName(Integer.toString(widgetId));
addPreferencesFromResource(R.xml.prefs);
}
}
@Override
public void onBackPressed() {
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
setResult(RESULT_OK, resultValue);
finish();
}
}
从我在代码中看到的情况来看,当您更新小部件时,您永远不会取消以前的报警。因此,您不断向AlarmManager添加越来越多的回调。尝试删除以前的回拨,然后添加一个新的回拨问题在于:
alarmManager.setInexactRepeating(AlarmManager.RTC, System.currentTimeMillis(), updateFrequencyMillis,
pendingIntent);
第二个参数是需要首先调用的时间,System.currentTimeMillis()表示现在,因此在此之后,OnReceive()中立即调用updateAppWidget(),后者立即再次调用此setInexactRepeating(),依此类推
解决方案:
alarmManager.setInexactRepeating(AlarmManager.RTC, System.currentTimeMillis() + updateFrequencyMillis,
updateFrequencyMillis, pendingIntent);
我尝试这样取消:alarmManager.cancel(PendingEvent),如果挂起的意图不是null,但没有任何更改。此外,updatePeriodMillis设置为0,那么为什么在开始时多次调用OnUpdate(),而不是一次呢?您不需要检查PendingEvent是否为null。在设置新警报之前,请先调用cancel。可能是在再次调用updateWidget之前,您的广播接收器已被GCd。对不起,它被调用了一次。再次调用Editet,我试图在setRepeating之前以及在获取alarmManager之后取消。为了回答您的最后一个问题,onUpdate()只调用了一次,正如您在我的第三条评论中看到的,我说过onUpdate()被调用了多次……但不是,我的错误。
alarmManager.setInexactRepeating(AlarmManager.RTC, System.currentTimeMillis(), updateFrequencyMillis,
pendingIntent);
alarmManager.setInexactRepeating(AlarmManager.RTC, System.currentTimeMillis() + updateFrequencyMillis,
updateFrequencyMillis, pendingIntent);