Android的 - 小部件AlarmManager重复太快 [英] android - widget AlarmManager repeating too fast

查看:174
本文介绍了Android的 - 小部件AlarmManager重复太快的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个小窗口,显示的数据使用,为了这个,我已经创建了一个preferenceActivity,用户可以从不同的更新频率选择..
我从共享preferences所选择的频率值,并与我开始报警,但我得到怪异的结果。这里是我的AppWidgetProvider:

 私有静态的PendingIntent的PendingIntent = NULL;
...
公共无效的onReceive(上下文的背景下,意图意图){
    Log.d(TAG,接收);
    super.onReceive(背景下,意图);    如果(CLOCK_WIDGET_UPDATE.equals(intent.getAction())){
        组件名thisAppWidget =新的组件名(context.getPackageName()的getClass()的getName());
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(上下文);
        INT IDS [] = appWidgetManager.getAppWidgetIds(thisAppWidget);
        对于(INT appWidgetID:IDS){
            updateAppWidget(背景下,appWidgetManager,appWidgetID);        }
    }
}@覆盖
公共无效的onUpdate(上下文的背景下,AppWidgetManager appWidgetManager,INT [] appWidgetIds){
    Log.d(TAG,更新);
    super.onUpdate(背景下,appWidgetManager,appWidgetIds);    的for(int i = 0; I< appWidgetIds.length;我++){
        INT appWidgetId = appWidgetIds [I]        updateAppWidget(背景下,appWidgetManager,appWidgetId);
    }
}公共静态无效updateAppWidget(上下文的背景下,AppWidgetManager appWidgetManager,诠释appWidgetId){    //启动定时
    AlarmManager alarmManager =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(的PendingIntent);    意向意图=新意图(CLOCK_WIDGET_UPDATE);
    的PendingIntent = PendingIntent.getBroadcast(背景下,0,意向,PendingIntent.FLAG_UPDATE_CURRENT);
    共享preferences preFS = context.getShared preferences(Integer.toString(appWidgetId),Context.MODE_PRIVATE);
    INT updateFrequencyMin =的Integer.parseInt(prefs.getString(KEY_UPDATE_FREQ,DEFAULT_UPDATE_FREQ));
    Log.d(TAG,更新频率:+ updateFrequencyMin);
    长updateFrequencyMillis = updateFrequencyMin * 60 * 1000;
    // alarmManager.cancel(的PendingIntent);
    alarmManager.setInexactRepeating(AlarmManager.RTC,System.currentTimeMillis的(),updateFrequencyMillis,
            的PendingIntent);    ....
    appWidgetManager.updateAppWidget(appWidgetId,视图);
}公共无效onDisabled(上下文的背景下){    AlarmManager M =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    m.cancel(的PendingIntent);
}

如果我将更新频率设置为5分钟InexactRepeating,我得到这个日志:

  08-18 15:30:17.902:D / TAG(23624):接收
08-18 15:30:18.122:D / TAG(23624):接收
08-18 15:30:18.122:D / TAG(23624):更新
08-18 15:30:18.122:D / TAG(23624):更新频率:60
08-18 15:30:22.582:D / TAG(23624):接收
08-18 15:30:22.602:D / TAG(23624):更新频率:60
08-18 15:30:33.272:D / TAG(23624):接收
08-18 15:30:33.282:D / TAG(23624):更新频率:60
08-18 15:30:39.692:D / TAG(23624):接收
08-18 15:30:39.692:D / TAG(23624):更新频率:60
08-18 15:31:33.292:D / TAG(23624):收到< ---我选择了频率
08-18 15:31:33.292:D / TAG(23624):更新频率:5
08-18 15:31:39.962:D / TAG(23624):接收
08-18 15:31:39.962:D / TAG(23624):更新频率:5

我不知道为什么的onReceive和的onUpdate被多次调用,当我在配置活动。

随着setRepeat方法更是雪上加霜,你可以看到的时间戳:

  15 08-18:38:59.992:D / TAG(24011):接收
08-18 15:39:00.242:D / TAG(24011):接收
08-18 15:39:00.242:D / TAG(24011):更新
08-18 15:39:00.252:D / TAG(24011):更新频率:60
08-18 15:39:00.442:D / TAG(24011):接收
08-18 15:39:00.442:D / TAG(24011):更新频率:60
08-18 15:39:00.562:D / TAG(24011):接收
08-18 15:39:00.562:D / TAG(24011):更新频率:60
08-18 15:39:00.642:D / TAG(24011):接收
08-18 15:39:00.642:D / TAG(24011):更新频率:60
08-18 15:39:00.652:D / TAG(24011):接收
08-18 15:39:00.652:D / TAG(24011):更新频率:60
08-18 15:39:00.662:D / TAG(24011):接收
08-18 15:39:00.662:D / TAG(24011):更新频率:60

最后,这是我的preference活动:

 公共类DataStatWidgetConfigure扩展$ P $ {pferenceActivity
    私人诠释为widgetid;    @燮pressWarnings(德precation)
    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);        捆绑额外= getIntent()getExtras()。
        如果(临时演员!= NULL){            为widgetid = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);
            Log.d(meeegy,Integer.toString(为widgetid));
            获得preferenceManager()setShared preferencesName(Integer.toString(为widgetid))。
            加preferencesFromResource(R.xml preFS);
        }    }    @覆盖
    公共无效onBack pressed(){
        意图resultValue =新的Intent();
        resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,为widgetid);
        的setResult(RESULT_OK,resultValue);
        完();
    }
}


解决方案

这是我在你的code看到的,你永远当你更新你的widget取消previous报警。所以,你不断增加越来越多的回调AlarmManager。尝试删除previous回电,然后添加一个新的

I have a widget which shows the data usage, for this I have created a PreferenceActivity where the user can choose from various update frequencies.. I get the chosen freq value from SharedPreferences and with that I start an alarm but I get weird result. Here is my 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);
}

If I set the update frequency to 5 minutes with InexactRepeating, I get this log:

08-18 15:30:17.902: D/TAG(23624): receive
08-18 15:30:18.122: D/TAG(23624): receive
08-18 15:30:18.122: D/TAG(23624): update
08-18 15:30:18.122: D/TAG(23624): Update freq: 60
08-18 15:30:22.582: D/TAG(23624): receive
08-18 15:30:22.602: D/TAG(23624): Update freq: 60
08-18 15:30:33.272: D/TAG(23624): receive
08-18 15:30:33.282: D/TAG(23624): Update freq: 60
08-18 15:30:39.692: D/TAG(23624): receive 
08-18 15:30:39.692: D/TAG(23624): Update freq: 60
08-18 15:31:33.292: D/TAG(23624): receive <--- I have chosen the freq
08-18 15:31:33.292: D/TAG(23624): Update freq: 5
08-18 15:31:39.962: D/TAG(23624): receive
08-18 15:31:39.962: D/TAG(23624): Update freq: 5

I don't know why the onReceive and the onUpdate are called multiple times when I am on the configuration activity.

With the setRepeat method it is worse as you can see the timestamps:

08-18 15:38:59.992: D/TAG(24011): receive
08-18 15:39:00.242: D/TAG(24011): receive
08-18 15:39:00.242: D/TAG(24011): update
08-18 15:39:00.252: D/TAG(24011): Update freq: 60
08-18 15:39:00.442: D/TAG(24011): receive
08-18 15:39:00.442: D/TAG(24011): Update freq: 60
08-18 15:39:00.562: D/TAG(24011): receive
08-18 15:39:00.562: D/TAG(24011): Update freq: 60
08-18 15:39:00.642: D/TAG(24011): receive
08-18 15:39:00.642: D/TAG(24011): Update freq: 60
08-18 15:39:00.652: D/TAG(24011): receive
08-18 15:39:00.652: D/TAG(24011): Update freq: 60
08-18 15:39:00.662: D/TAG(24011): receive
08-18 15:39:00.662: D/TAG(24011): Update freq: 60

And finally, this is my preference activity:

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

解决方案

From what I see in your code, you never cancel your previous alarms when you update your widget. So you keep adding more and more callback to AlarmManager. Try removing the previous call back and then add a new one

这篇关于Android的 - 小部件AlarmManager重复太快的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆