2017-08-17 2 views
0

Dans mon application, je dois mettre à jour un objet si l'utilisateur ne l'a pas actualisé pendant 30 jours. J'ai essayé plusieurs choses à aborder, mais aucun d'entre eux travaillaientAndroid: compte jours à partir d'un moment donné sans compter sur l'heure du système d'exploitation

1. À l'aide System.currentTimeMillies()

Mon premier essai était de stocker juste au moment où l'objet a été mis à jour et le comparer à l'heure actuelle. Tout fonctionnait bien, mais le problème est que l'utilisateur peut changer le temps d'os et la vérification de temps serait inutile ...

2. A l'aide AlarmManager

Ici, j'ai eu le même problème que ci-dessus

3. la mise en œuvre d'un service qui contient une minuterie

ici, je mis en place un Service avec une minuterie qui compte seulement jusqu'à 30 jours. Cela semblait être la meilleure solution, mais le service s'arrête lorsque je ferme l'application. le onCreate et onStartCommand de mon regard de service comme celui-ci (je viens de changer 30 jours à 2 minutes pour le test et il contient plusieurs minuteries pour plusieurs objets):

@Override 
public void onCreate() { 
    Log.i(TAG, "[onCreate]"); 
    super.onCreate(); 
    registerReceiver(new StopServiceReceiver(), new IntentFilter(STOP_SERVICE_REQUEST)); 
    context = this; 

    //retrieveTimers(); 
} 


@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    if (intent == null) { 
     Log.i(TAG, "[onStartCommand] intent = null"); 
     return super.onStartCommand(intent, flags, startId); 
    } 

    //prevent starting 2 timers for the same id 
    String id = intent.getStringExtra(KEY_CARD_ID); 
    if (timerHashMap.containsKey(id)) { 
     Log.i(TAG, "[onStartCommand] timer already exists"); 
     return super.onStartCommand(intent, flags, startId); 
    } 

    //create and start timer 
    Log.i(TAG, "[onStartCommand] schedule timer"); 
    Timer timer = new Timer(); 
    timer.schedule(new CounterTask(id), MAX_MILLIES_WITHOUT_UPDATE); 
    timerHashMap.put(id, timer); 
    // storeTimers(); 

    return super.onStartCommand(intent, flags, startId); 
} 

J'ai aussi essayé de stocker la carte de minuterie dans la commune préférences mais plus tard je me suis rendu compte que c'était assez stupide parce que les minuteurs devaient continuer et sérialiser une minuterie pour les stocker n'était pas possible (et comme je l'ai dit un peu stupide ;-))

Merci pour votre aide!

Répondre