Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android-widget AlarmManager重复太快_Android_Android Widget_Alarmmanager - Fatal编程技术网

android-widget AlarmManager重复太快

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.

我有一个显示数据使用情况的小部件,为此我创建了一个PreferenceActivity,用户可以从各种更新频率中进行选择。。 我从SharedReferences中获取所选的频率值,然后启动警报,但得到的结果很奇怪。这是我的AppWidgetProvider:

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