Problem med PendingIntent från AlarmManager i Android 4.4.2

Diskussion i 'Frågor, support och diskussion' startad av henca, 4 okt 2014.

  1. henca

    henca Senior Droid Medlem

    Blev medlem:
    30 dec 2009
    Inlägg:
    1 313
    Mottagna gillanden:
    192

    MINA ENHETER

    Jag har en app som periodiskt går ut och hämtar data från en websida för att uppdatera information i en widget. Användaren kan själv välja om detta skall ske en gång per dygn, en gång i timmen eller en gång i kvarten.

    Problemet är att i Android 4.4.2 sker det inte så ofta som användaren vill utan ungefär var fjärde sekund!

    Min kod för att skapa en PendingIntent ser ut på följande vis:
    Kod:
    149 	 switch(RefreshId)
    150 	{
    151 	case R.id.update_15m:
    152 	iRefreshTimeSeconds = 15*60;
    153 	lAlarmRepeat = AlarmManager.INTERVAL_FIFTEEN_MINUTES;
    154 	break;
    155 	case R.id.update_1h:
    156 	iRefreshTimeSeconds = 60*60;
    157 	lAlarmRepeat = AlarmManager.INTERVAL_HOUR;
    158 	break;
    159 	case R.id.update_1d:
    160 	iRefreshTimeSeconds = 24*60*60;
    161 	lAlarmRepeat = AlarmManager.INTERVAL_DAY;
    162 	break;
    163 	default:
    164 	iRefreshTimeSeconds = 0;
    165 	break;
    166 	}
    167 	AlarmManager alarmMgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    168 	if(iRefreshTimeSeconds > 0)
    169 	{
    170 	Intent updateintent = new Intent("se.poolhem.telenorkontant.UPDATE_WEB");
    171 	pendingIntentTimer = PendingIntent.getBroadcast(context, 0, updateintent, 0);
    172 	alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), lAlarmRepeat, pendingIntentTimer);
    173 	}
    
    (ber om ursäkt för radnummer och brist på indentering, det blev så vid copy-paste). Koden går även läsa i sin helhet i ett lite snyggare format på http://telenorkontant.cvs.sourcefor.../TelenorWidget.java?revision=1.24&view=markup

    Min kod för att ta emot dessa PendingIntent ser ut på följande vis:
    Kod:
    61 	 public void onReceive(Context context, Intent intent) {
    62 	Log.d("TelenorKontant", "Entering onReceive...");
    63 	final String action = intent.getAction();
    64 	
    65 	if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
    66 	final int appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);
    67 	if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
    68 	this.onDeleted(context, new int[] { appWidgetId });
    69 	}
    70 	}
    71 	else if(action.equals("se.poolhem.telenorkontant.UPDATE_WEB"))
    72 	{
    73 	updateSaldoFromWeb(context);
    74 	}
    
    Denna kod hamnar alltså alldeles för ofta på rad 73 i Android 4.4.2.

    Jag har sökt på nätet efter andra med liknande problem. Det verkar som om någonting har skett med denna typ av timers i Android 4.4, man måste använda setInexactRepeating i stället för som tidigare med tillgång även till setRepeating, men jag använder redan setInexactRepeating i min kod.

    Finns det någon som har någon aning om hur jag skall undvika detta jätte-spammande av intents som kommer i Android 4.4.2?

    m v h Henrik
     
  2. asperon

    asperon Adult Droid Medlem

    Blev medlem:
    6 aug 2009
    Inlägg:
    586
    Mottagna gillanden:
    94
    Operatör:
    Tele2
    Telefon:
    Pixel 6

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    Pixel 6
    Tar inte den sitt värde i millisekunder? tror det är därför det sker för ofta. Läs på i API deklarationen.
     
  3. henca

    henca Senior Droid Medlem

    Blev medlem:
    30 dec 2009
    Inlägg:
    1 313
    Mottagna gillanden:
    192

    MINA ENHETER

    Tack för svaret! Jo, det kan mycket väl tänkas att den tar värdet i millisekunder. Jag beklagar att jag i min kod har kvar variabeln iRefreshTimeSeconds som en förvirrande rest från en äldre lösning. Dessa sekunder används dock numera bara i en if-sats, de används inte då AlarmManagern konfigureras. Till AlarmManagern används i stället lAlarmRepeat som sätts till värden av typen AlarmManager.INTERVAL_FIFTEEN_MINUTES, d v s fördefinierade värden som borde vara rätt. Det kan som sagt mycket väl tänkas att INTERVAL_FIFTEEN_MINUTES anger ett värde i millisekunder, men med denna typ av define borde man inte behöva oroa sig över enheten.

    m v h Henrik