2010-08-25 5 views
7

Je sais, il y a plusieurs questions de ce type mais j'ai tout essayé et ça ne marche toujours pas.
Ok, pour mon application; J'ai une activité. Dans cette activité, il y a 4 onglets, et le quatrième contient une liste et un bouton d'enregistrement. Quand je pousse l'enregistrement, il y a un écouteur GPS qui commence. Après avoir obtenu une nouvelle valeur gps, il l'enfonce dans la liste.
Cela fonctionne jusqu'à présent!
Si je clique sur le bouton d'accueil, il fonctionne toujours, si je le presser alors. Il reprend cette activité avec l'onglet spécifique ouvert et la liste contient toujours les listitems et l'écouteur gps est toujours actif.
Cela fonctionne aussi bien!
Maintenant, je voulais ajouter une notification, qui montre le nombre de valeurs gps de la liste en tant que .number. À chaque nouveau signal GPS, il met à jour l'icône de notification avec le nouveau numéro. Ce n'est pas un problème, mais l'action de cliquer sur la notification déconnecte totalement mon application.Notification CV Activité

Le code actuel ressemble à ceci:

public void callNotify(String text) { 
    notif = new Notification(); 
    Intent contentIntent = new Intent(this, tabactivity.class); 
    contentIntent.putExtra("fid", this.specialvalue); 
    contentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
     | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    notif.icon = R.drawable.icon; 
    notif.setLatestEventInfo(this, getString(R.string.app_name), text, 
     PendingIntent.getActivity(this.getBaseContext(), 0, contentIntent, 
      PendingIntent.FLAG_UPDATE_CURRENT)); 
    notif.ledARGB = Color.RED; 
    notif.ledOnMS = 200; 
    notif.ledOffMS = 200; 
    notif.flags = Notification.FLAG_SHOW_LIGHTS 
     | Notification.FLAG_ONGOING_EVENT 
     | Notification.FLAG_ONLY_ALERT_ONCE; 
    notif.number = notifyNumber; 
    mNotificationManager.notify(notifyNumber, notif); 
} 

public void updateNotify(String text) { 
    notifyNumber++; 
    notif.number = (int) (notifyNumber/2); 
    Intent contentIntent = new Intent(this, tabactivity.class); 
    contentIntent.putExtra("fid", this.specialvalue); 
    contentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
     | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    notif.setLatestEventInfo(this, getString(R.string.app_name), text, 
     PendingIntent.getActivity(this.getBaseContext(), 0, contentIntent, 
      PendingIntent.FLAG_UPDATE_CURRENT)); 
    mNotificationManager.cancel((notifyNumber - 2)); 
    mNotificationManager.notify(notifyNumber, notif); 
} 

Ainsi, le UpdateNotify() est appelée sur un nouveau signal GPS. Et le callNotify() est le premier, avant qu'il ne démarre l'écouteur gps. Et, oui, le notifyNumber/2 était mon intention, parce que je travaille avec ce nombre plus loin.

Si je le compile comme ceci, et que je clique sur la Notification, cela ouvre une NOUVELLE tabactivité sur le premier onglet. Si je clique alors, je reçois beaucoup d'erreurs (la base de données est toujours ouverte, nullpointers et d'autres choses). Je pense que parce que ça commence une nouvelle tabactivité et que l'autre est encore ouverte, parce que je peux voir que l'auditeur GPS fonctionne toujours.

Donc, ce que je veux, c'est que je peux faire ce qui suit: J'ouvre mon application, allez à la tabactivité, ouvrez l'onglet 4, cliquez sur Enregistrer. Si je clique dessus alors, il devrait cacher l'application, aussi, si je clique juste sur le bouton d'accueil. Mais il y a une notification. Si je clique sur celui-ci, il devrait juste montrer à nouveau l'activité cachée et c'est tout. Alors, qu'est-ce que je fais de mal ici? Je pensais que les drapeaux FLAG_ACTIVITY_CLEAR_TOP et FLAG_ACTIVITY_SINGLE_TOP devraient résoudre le problème?

Répondre

6

Ce qui se passe ici est un peu déroutant alors portez-moi ici. Selon les docs If set, the activity will not be launched if it is already running at the top of the history stack., si l'activité en cours n'est pas en haut de la pile de l'historique, elle sera relancée.

FLAG_ACTIVITY_CLEAR_TOP à nouveau de la documentation If set, and the activity being launched is already running in the current task, then instead of launching a new instance of that activity, all of the other activities on top of it will be closed and this Intent will be delivered to the (now on top) old activity as a new Intent.

Par défaut, le TabActivity sera toujours ouverte à l'onglet 0, vous pouvez utiliser setDefaultTab changer cela via le code. Chaque onglet dans le TabHost est également une nouvelle Intent

Si je compile comme ça, et cliquez sur sur la notification, il ouvre une nouvelle tabactivity sur le premier onglet. Si je cliquez à l'époque, je reçois beaucoup d'erreurs (base de données est toujours ouverte, nullpointers et d'autres choses).

Ce qui se passe Je pense que parce que le courant est Intent TAB4 (en réalité son n ° 3, 0,1,2,3) et votre notification apporte la tabactivity.class.Comme il n'est pas actif ou au sommet de la pile, chaque action est fermée, y compris tab4.

Alors, ce que je veux est que je peux faire la suivante: J'ouvre mon application, allez à la tabactivity, onglet ouvert 4, cliquez sur Enregistrer. Si je clique à l'époque, il devrait cacher l'application, aussi, si je clique simplement sur le bouton d'accueil . Mais il y a une notification . Si je clique sur celui-ci, il devrait juste montrer à nouveau l'activité cachée et c'est tout. Alors, quoi je fais mal là-bas? Je pensais, le Drapeaux FLAG_ACTIVITY_CLEAR_TOP et FLAG_ACTIVITY_SINGLE_TOP devrait résoudre le problème?

Vous confondez ce que les drapeaux font et ce qui se passe avec les touches home et back. Frapper home masquera votre activité et la notification devrait fonctionner correctement avec ces drapeaux (une fois que vous aurez résolu le problème mentionné plus haut). Lorsque vous cliquez sur back, Android termine le Activity actuel et l'enlève de la pile. Comme il n'y a rien en dessous, vous êtes obligé de vous relancer de zéro lorsque vous appuyez sur la notification.

+1

Eh bien, en fait je sais, pourquoi sauter sur le premier onglet. La tabactivité commence généralement au premier onglet, mais le quatrième onglet a cette liste gps. Donc pour moi ist logiquement, que c'est l'ouverture de la tabactivité deux fois. Parce que les données initiales de la liste et d'autres choses ne sont pas chargées à ce moment-là. Donc, les drapeaux ont tort? Je ne comprends pas en quelque sorte ... –

+2

Oh attends ... ça a l'air de marcher, si j'utilise juste FLAG_ACTIVITY_SINGLE_TOP et pas les deux. Ok, si c'était l'erreur, j'ai complètement mal compris les docs. Pardon! –