1. Just nu får du 3 månader till halva priset & 50GB extra surf när du beställer ett mobilabonnemang hos Fello! Testa Årets Mobiloperatör du med! Surfa in på fello.se
    Stäng notis
  2. Registrera ett konto hos Sveriges trevligaste techcommunity!
    Stäng notis
  3. Stäng notis
  4. Stäng notis
  5. Stäng notis
  6. Stäng notis

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 307
    Mottagna gillanden:
    174

    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 307
    Mottagna gillanden:
    174

    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