web-dev-qa-db-fra.com

Problèmes d'activité Onpaause / ONRESUME

J'ai une petite application de test que je travaille sur lequel a une minuterie qui met à jour un TextView au compte à rebours de 100 à 0k qui fonctionne bien, mais maintenant j'essaie de mettre en pause la demande si l'utilisateur appuie sur le bouton arrière du téléphone, puis Redémarrez la minuterie d'où ils se sont arrêtés lorsqu'ils rouvrent l'application. Voici le code que j'utilise:

@Override
public void onPause()
{
    if(this._timer_time_remaining > 0) {
        this.timer.cancel();
    }
    super.onPause();
    Log.v("Pausing", String.format("Pausing with %d", this._timer_time_remaining));
}

@Override
public void onResume()
{
    Log.v("Resuming", String.format("Resuming with %d", this._timer_time_remaining));

    if(this._timer_time_remaining > 0) {
        start_timer(this._timer_time_remaining);
    }
    super.onResume();
}

La méthode start_timer () crée un compteDownTimer qui met à jour le TextView de la méthode ontictic et met à jour la variable de cette._timer_time_reming in int.

Countowntimer et _timer_Time_Reming sont tous deux déclarés au niveau de la classe comme celui-ci:

private CountDownTimer timer;
private int _timer_time_remaining;

À partir des impressions log.v (), je vois que la variable _timer_time_reming a le nombre correct de secondes stockées lorsque l'on appelle l'onpaause, mais elle est définie sur 0 lorsque OnResume commence. Pourquoi la variable est-elle réinitialisée? Je pensais que l'application continuerait à courir en arrière-plan avec les mêmes valeurs. Est-ce que je manque quelque chose? Tout cela est déclaré dans une classe qui étend une activité.

Merci d'avance!

Remarque: édité pour nettoyer la copie du code

14
Blather

Si vous jetez un coup d'œil au diagramme pour Activité Lifecycle Vous réaliserez qu'il n'y a aucune garantie sur votre activité après que l'on appelle l'appelle. =Android peut vous tuer d'activité sans même appeler OnDestroy. Vous devez enregistrer votre état à l'aide de OnsaveInstanCestate et restaurer-le à l'aide OnrestoreInstancestate .

this pourrait être utile.

ÉDITER:

Le cycle de vie couvre différents scénarios. Si vous n'avez qu'une seule activité, une pression sur le dos est équivalente à la sortie de votre application. Si vous avez une activité A qui commence l'activité B, alors onSaveInstanCestate est appelée à une activité A. Lorsque vous appuyez sur l'activité B, il suffit de quitter l'activité et de l'onrestoreInstancesse est appelée à une activité A. Vous essayez de sauvegarder des données entre deux points distincts de votre application et vous Besoin d'utiliser une sorte de stockage persistant pour cela.

16
Nikola Smiljanić

C'est ainsi que je voudrais enregistrer la valeur: (quatre lignes de code)

SharedPreferences example = getSharedPreferences("example", MODE_PRIVATE);
SharedPreferences.Editor edit = example.edit();
edit.putInt("time_remaining", (Integer)this._timer_time_remaining);
edit.commit();

Sur CV, faites ceci: (Deux lignes de code)

SharedPreferences example = getSharedPreferences("example", MODE_PRIVATE);
int time_remaining = example.getInt("time_remaining", 0);

Je l'ai adapté de certains de mon code de travail, mais je ne l'ai pas testé dans ce format exact. Rechercher la documentation pour les préférences partagées pour savoir comment cela fonctionne.

2
user425923

Je ne suis pas un expert sur Android, mais je dis juste comment je m'attends à ce que la minuterie se comporte

this.timer.cancel(): - annulerait la minuterie, mais ne pas la mettre en pause

start_timer(this._timer_time_remaining): - "redémarrerait" la minuterie, ne continue pas de la dernière position.

Alors ce que vous voyez est correct. Chaque fois que le temps passe à nouveau. Découvrez quelle est l'API pour mettre en pause la minuterie (le cas échéant).

1
ashoke

Vous pouvez simplement écrire le délai d'exécution dans une base de données ou un fichier en Onpause et de le lire à OnResume.

0
James

Vous pouvez également essayer d'écouter les appuie sur les touches (ONKEYDOWN ()) pour intercepter le bouton arrière et enregistrer vos données sur une table SQLITE.

0
Juan