2010-08-25 3 views
9

Je développe une application avec de nombreuses activités. Je voudrais créer une notification persistante qui (plus ou moins) dit, "AppName - Return to AppName" qui sera présent lorsque mes services d'arrière-plan sont en cours d'exécution. La création et l'élimination de la notification n'étaient pas un problème.Utiliser une notification persistante pour permettre à l'utilisateur de revenir à l'application Android en cours

Maintenant, l'utilisateur peut être sur l'un de plusieurs écrans/activités, quitter l'application, puis vouloir entrer à nouveau l'application via la notification. Le problème est, la notification doit avoir une intention, qui lance une activité prédéterminée. Je souhaite que la notification réapparaisse dans l'application au quelle que soit l'activité située en haut de la pile d'historique.

Ma première tentative d'une solution de contournement laide était de faire une activité (appelons-la "returnFromNotify") dont le seul travail était de "se terminer" dans son "onCreate". La notification ouvrirait "returnFromNotify" dans la portée de l'historique des applications, qui se retirerait alors immédiatement, renvoyant l'utilisateur à l'état d'historique précédent dans la pile d'applications. Cela semble fonctionner ... sauf si l'utilisateur a utilisé "retour" pour complètement revenir en arrière de l'application. Ensuite, quand ils frappent la notification, "returnFromNotify" se charge, puis se termine, en les renvoyant à l'écran d'accueil (car il n'y a aucune activité dans la pile d'historique pour l'application).

J'ai envisagé d'essayer de détecter s'il y avait quelque chose dans la pile d'historique avant "returnFromNotify", et si ce n'est pas le cas, lancez mon activité principale. Je n'arrive pas à trouver un moyen de le faire non plus.

Toute contribution ou suggestion pour un novice Java/Android? Pour votre information, mon histoire primaire est avec les langages basés sur le script.

Répondre

6

J'aime votre idée originale de créer une activité « returnFromNotify » mieux que votre solution de contournement proposée, car il est possible de détecter si le ResumeActivity est au bas de la pile (et donc la seule activité de la pile) .

Voilà comment vous pouvez le faire:

Ajoutez votre ResumeActivity au manifeste et spécifiez le noHistory attribut:

<activity android:name=".ResumeActivity" android:noHistory="true" /> 

Définition Nohistory fera en sorte cette activité ne restera pas dans la pile dès comme il finit. De cette façon, vous savez que seule une instance de ResumeActivity en cours d'exécution apparaîtra dans la pile.

Afin de vérifier la pile d'applications, vous devez également demander la GET_TASKS permission:

<uses-permission android:name="android.permission.GET_TASKS" /> 

Maintenant, vous pouvez utiliser ActivityManager::getRunningTasks() pour déterminer si ResumeActivity est la seule activité de la pile:

Je sais que vous avez posé cette question il y a plus de 2 ans, mais je fournis cette réponse au cas où quelqu'un d'autre se trouve dans cette situation particulière (comme je l'ai fait). Je pense que vous étiez sur la bonne voie avec la solution à laquelle vous travailliez à l'origine.

+0

Oui! Ce projet était pour un travail que je ne suis même plus avec, donc je n'en ai absolument pas besoin ... mais ça ressemble EXACTEMENT à ce que je cherchais, alors merci! J'espère que quelqu'un d'autre le trouvera utile aussi. – Slobaum

3

D'accord, je crois que j'ai trouvé une solution de rechange satisfaisante pour mon cas spécifique. J'ai ajouté un entier statique à mon "mainActivity", et chaque fois que "onCreate" est déclenché, il incrémente l'entier. Chaque fois que "onDestroy" est renvoyé, il décrémente.

Dans mon "returnFromNotify", je regarde l'entier statique pour voir s'il est supérieur à 0. Si oui, je suppose qu'il y a un "mainActivity" actif, et que "finish" dans "returnFromNotify" retournera Là. Sinon, il suppose que les utilisateurs ont "sauvegardé", se termine, puis utilise "startActivity" pour lancer une nouvelle instance de "mainActivity".

Ce n'est pas une solution universelle, mais pour mon propos, je pense que cela suffira. Je suis toujours ouvert à d'autres réponses, et si quelqu'un peut percer un trou dans ma logique, s'il vous plaît le faire - constructive la critique est la bienvenue. Merci.

1

Je suppose qu'il n'y a pas moyen facile de faire cela, mais au lieu d'ajouter un compteur dans le MainActivity j'étendrait Application:

classe de base pour ceux qui ont besoin de maintenir l'état global de l'application. Vous pouvez fournir votre propre implémentation par spécifiant son nom dans votre balise de AndroidManifest.xml , ce qui provoque cette classe pour être instancié pour vous lorsque le processus pour votre application/package est créé.

Je mantein la logique là et avoir une méthode comme:

public Intent getIntentForLastActivityShown(); 

à appeler lorsque l'élément de notification est cliqué.

+1

Comment utiliseriez-vous ensuite getIntentForLastActivityShown()? Ne serait-il pas plus facile de garder un contrôle sur la notification dans la classe Application, puis chaque fois que vous lancez un nouvel appel d'intention setLatestEventInfo à partir du notificaiton et mettez à jour le pendingIntent à l'activité visible actuelle. – schwiz

1

Ma première approche serait d'utiliser SharedPreferences et de stocker une paire de valeur de clé appelée quelque chose comme lastDisplayedActivity. Ensuite, dans chaque onResume de l'activité (et peut-être `onCreate ') vous auriez une ligne comme celui-ci:

sharedPreferences.edit().putInteger("lastDisplayedActivity", ReturnFromNotify.THIS_ACTIVITY_NAME); 

En d'autres termes, vous enregistrez une variable large application indiquant que l'activité a été affichée dernière. Ensuite, vous venez de saisir cette variable de SharedPreferences et lancer l'activité correspondante.

+0

Ce n'est pas une mauvaise idée, mais cela m'obligerait à ajouter du code au cycle de vie de chaque activité (ce que je préférerais ne pas faire). En outre, le lancement de l'activité correspondante maintiendrait-il l'état de l'instance d'activité précédente ou créerait-il une nouvelle instance de cette activité? J'en ai vraiment besoin pour conserver l'état dans lequel ils se trouvaient. – Slobaum

+0

Il peut restaurer l'état automatiquement dans certains cas, mais si votre activité n'est pas actuellement affichée, Android * peut la tuer à tout moment * pour récupérer de la mémoire supplémentaire. En d'autres termes, si vous voulez être sûr de sauvegarder l'état de l'activité, vous devez l'enregistrer ailleurs. Il existe de nombreuses façons de le faire, mais si vous avez une bonne quantité de données, je recommanderais d'utiliser une base de données SQLite: http://developer.android.com/guide/topics/data/data-storage.html#db – Computerish

0

J'utilise généralement l'activité nommée "Launcher" qui vérifie l'état de mon application modèle et démarre des activités (ou fait d'autres choses) selon les règles du modèle. Je mets objet Model dans ma classe Application. Le modèle peut utiliser Préférences pour stocker son état. Je le fais pour éviter les champs statiques dans les activités.

Questions connexes