Passer des données entre l'activité android. Transfert de données entre activité

Passer des données entre l'activité android. Transfert de données entre activité

18.10.2020

Bonjour.

Il est nécessaire de transférer les données reçues via UART vers Activity. Cela peut être fait en créant un thread dans l'activité dans lequel organiser une boucle while (! IsInterrupted ()) et lire les données à partir du tampon UART. Après cela, en appelant le thread d'interface utilisateur de l'activité - MainActivity.this.runOnUiThread (new Runnable (), effectuez les actions nécessaires avec cette activité. Mais si nous appelons d'autres activités à partir de l'activité principale, le fil organisé ne permet pas de transférer des données vers l'activité nouvellement créée. Si je Je comprends correctement que pour que les données du flux soient transférées vers une activité, le flux doit être créé non pas dans l'activité, mais dans le service.

Question: les données sont arrivées via UART, dans un flux (qui est créé dans Servce), il est nécessaire de transférer des données vers l'activité, qui est maintenant active, comment cela peut-il être fait et est-ce réellement fait?

1 réponse

Créez un gestionnaire dans chaque activité. Dans la méthode onResume () de cette activité, bindService (). Là, l'un des paramètres est l'interface ServiceConnection. Implémentez-le au moins avec la même activité. Implémentez la méthode onServiceConnected () dedans. Dans ce rappel, le service lui-même est l'un des paramètres. Appelez donc ce service votre propre méthode setHandler (). Passez-y le gestionnaire qui est dans l'activité actuelle. Mais envoyez les données entrantes via UART au service sur ce gestionnaire. À propos, Handler s'exécute traditionnellement sur le thread principal, vous n'aurez donc pas besoin de runOnUiThread pour s'exécuter.

L'application ne se compose pas toujours d'un seul écran. Par exemple, nous avons créé un programme très utile et l'utilisateur veut savoir qui est l'auteur. Il clique sur le bouton "A propos du programme" et accède à un nouvel écran, où il y a des informations utiles sur la version du programme, l'auteur, l'adresse du site, le nombre de chats de l'auteur, etc. Considérez un écran d'activité comme une page Web avec un lien vers une autre page. Si vous regardez le code dans le fichier MainActivity.java des leçons précédentes, vous verrez que notre classe Activité principale s'applique également à Activité (ou ses héritiers) ou, plus précisément, hérité de lui.

La classe publique MainActivity étend AppCompatActivity

Comme vous pouvez le deviner, nous devrions créer une nouvelle classe, qui pourrait ressembler à Activité principale puis basculez-y lorsque vous appuyez sur le bouton.

Pour l'expérience, nous allons reprendre le programme de la première leçon et utiliser un bouton pour les expériences (ou créer un nouveau projet avec un bouton à l'écran). Ensuite, créons un nouveau formulaire pour afficher des informations utiles. Par exemple, montrons à l'utilisateur ce que fait le chat lorsqu'il marche à gauche et à droite. D'accord, c'est une information très importante qui donne un indice sur l'Univers.

Nous allons créer une nouvelle activité manuellement, bien que le studio dispose de modèles prêts à l'emploi. Mais il n'y a rien de compliqué et pour mieux comprendre il est utile de tout faire à la main.

Créer un nouveau fichier de balisage XML activity_about.xml dans le dossier res / layout... Faites un clic droit sur le dossier disposition et sélectionnez dans le menu contextuel Nouveau | Fichier de ressources de mise en page... Une boîte de dialogue apparaîtra. Dans le premier champ, saisissez le nom du fichier activity_about... Dans le second, vous devez entrer l'élément racine. Par défaut, il y a ContrainteMise en page... Effacez le texte et entrez ScrollView... Il suffit de saisir quelques caractères pour que le studio propose des options prêtes à l'emploi, vous pouvez immédiatement appuyer sur Entrée, sans attendre la saisie complète du mot:

Nous obtiendrons le blanc correspondant, dans lequel nous insérerons l'élément Affichage.

Les informations seront extraites des ressources, à savoir d'une ressource chaîne about_text... Maintenant, il est surligné en rouge, signalant le manque d'informations. Tu pourrais appuyer Alt + Entrée et entrez le texte dans la boîte de dialogue. Mais pour notre exemple, cette méthode ne fonctionnera pas, puisque notre texte sera multi-lignes, en utilisant des caractères de contrôle. Alors faisons les choses différemment. Ouvrons le fichier res / values \u200b\u200b/ strings.xml et saisissez manuellement le texte suivant:

Un chêne vert au bord de la mer; \\ n Une chaîne dorée sur un tom chêne: \\ n Jour et nuit chat scientifique\\ n Tout suit la chaîne dans un cercle; \\ n Va droite - la chanson commence, \\ n La gauche - dit un conte de fées.

Nous avons utilisé les balises de formatage de texte HTML les plus simples comme , , ... Pour notre exemple, il suffit de mettre en évidence en gras les mots qui font référence au chat et au sens du mouvement. Pour transférer du texte sur une nouvelle ligne, utilisez les symboles \\ n... Ajoutons une autre ressource de chaîne pour le titre du nouvel écran:

À propos du programme

Nous avons compris le balisage. Ensuite, vous devez créer une classe pour la fenêtre AboutActivity.java... Choisissez dans le menu Fichier | Nouveau | Classe Java et remplissez les champs obligatoires. Dans un premier temps, il suffit d'indiquer uniquement le nom. Traitez ensuite d'autres domaines.

Obtenons un blanc.

La classe est maintenant presque vide. Ajoutons le code manuellement. La classe doit hériter de la classe abstraite Activité ou ses proches comme FragmentActivité, AppCompatActivity etc. Nous ajoutons étend l'activité... La classe d'activité doit avoir une méthode onCreate ()... Nous plaçons le curseur de la souris dans la classe et sélectionnons dans le menu Code | Remplacer les méthodes (Ctrl + O). Dans la boîte de dialogue, nous recherchons la classe souhaitée, vous pouvez taper les premiers caractères du clavier pour recherche rapide... Dans la méthode créée, vous devez appeler la méthode setContentView ()qui chargera le balisage préparé sur l'écran. Nous aurons cette option.

Package ru.alexanderklimov.helloworld; import android.app.Activity; import android.os.Bundle; / ** * Créé par Alexander Klimov le 01.12.2014. * / classe publique AboutActivity s'étend l'activité (@Override protected void onCreate (Bundle savedInstanceState) (super.onCreate (savedInstanceState); setContentView (R.layout.activity_about);))

Maintenant, la chose la plus importante commence. Notre tâche consiste à accéder à un nouvel écran lorsque vous cliquez sur le bouton du premier écran. Retourner en classe Activité principale... Écrivons un gestionnaire de clic de bouton:

Public void onClick (Afficher la vue) (Intent intent \u003d new Intent (MainActivity.this, AboutActivity.class); startActivity (intent);)

Ici, j'ai utilisé la méthode de gestion des clics de bouton que j'ai décrite dans la leçon.

Pour démarrer un nouvel écran, vous devez créer une instance de la classe Intention et spécifiez la classe actuelle dans le premier paramètre, et la classe pour la transition dans le second, nous avons ceci À propos de l'activité... Après cela, la méthode est appelée startActivity ()qui lance un nouvel écran.

Si vous essayez maintenant de tester l'application dans l'émulateur, vous recevrez un message d'erreur. Qu'avons-nous fait de mal? Nous avons manqué une étape importante. Vous devez en enregistrer un nouveau Activité dans le manifeste AndroidManifest.xml... Trouvez ce fichier dans votre projet et double-cliquez dessus. La fenêtre d'édition de fichier s'ouvre. Ajouter un nouveau tag après la balise de fermeture pour la première activité. Imprimez-vous et utilisez les invites activement. Le résultat est le suivant:

Ainsi, la ressource de chaîne s'est avérée utile about_title... Lancez l'application, cliquez sur le bouton et ouvrez la fenêtre À propos du programme... Ainsi, nous avons appris à créer une nouvelle fenêtre et à l'appeler en un clic. Et nous avons à notre disposition un programme méga-pratique - maintenant il y aura toujours un indice à portée de main de ce que fait le chat quand il va vers la gauche.

Encore une fois, j'attire votre attention sur le fait que la deuxième classe d'activité créée doit hériter de la classe Activité ou similaire ( ListActivity et autres), avoir un fichier de balisage XML (si nécessaire) et être écrit dans le manifeste.

Après avoir appelé la méthode startActivity () une nouvelle activité commencera (dans ce cas À propos de l'activité), il deviendra visible et se déplacera vers le haut de la pile contenant les composants en cours d'exécution. Lors de l'appel de la méthode terminer () à partir d'une nouvelle activité (ou lorsqu'une touche de retour forcé est enfoncée), elle sera fermée et supprimée de la pile. Le développeur peut également accéder à l'activité précédente (ou à toute autre) en utilisant la même méthode. startActivity ().

Comment créer un troisième écran - un moyen pour les paresseux

Les programmeurs, comme les chats, sont des créatures paresseuses. Rappelez-vous toujours que pour l'activité, vous devez créer un balisage et une classe qui hérite de Activité, puis n'oubliez pas d'enregistrer la classe dans le manifeste - eh bien, nafig.

Dans ce cas, sélectionnez dans le menu Fichier | Nouveau | Activité | Activité de base (ou un autre modèle). Ensuite, la fenêtre familière pour créer une nouvelle activité apparaîtra. Nous remplissons les champs obligatoires.

Cliquez sur le bouton terminer et l'activité sera prête. Pour vérifier cela, ouvrez votre fichier manifeste et recherchez une nouvelle entrée. Je ne parle pas de fichiers de classe et de balisage, ils apparaîtront devant vous.

Ajoutez vous-même un nouveau bouton sur l'écran principal de l'activité et écrivez le code pour accéder à l'activité créée.

Dans un premier temps, je vous conseillerais de créer manuellement tous les composants nécessaires à une nouvelle activité afin de comprendre la relation entre classe, balisage et manifeste. Et lorsque vous mettez la main dessus, vous pouvez utiliser l'assistant de création d'activité pour accélérer votre travail.

Transférer des données entre les activités

Nous avons utilisé l'exemple le plus simple pour appeler un autre écran d'activité. Parfois, il est nécessaire non seulement d'appeler un nouvel écran, mais également d'y transférer des données. Par exemple, nom d'utilisateur. Dans ce cas, vous devez utiliser une zone spéciale extraDataque la classe a Intention.

Région extraData est une liste de paires valeur cléqui est transmis avec l'intention. Les chaînes sont utilisées comme clés, et pour les valeurs, vous pouvez utiliser tous les types de données primitifs, tableaux de primitives, objets de classe Paquet et etc.

Pour transférer des données vers une autre activité, utilisez la méthode putExtra ():

Intent.putExtra ("Clé", "Valeur");

L'activité de réception doit appeler une méthode appropriée: getIntExtra (), getStringExtra () etc.:

Int count \u003d getIntent (). GetIntExtra ("nom", 0);

Refaisons l'exemple précédent. Nous avons déjà trois activités. La première activité aura deux champs de texte et un bouton. L'apparence peut être la suivante:

La deuxième activité SecondActivity installer l'élément Affichage, dans lequel nous afficherons le texte reçu de la première activité. Écrivons le code suivant pour la méthode onCreate () à la deuxième activité.

@Override protected void onCreate (Bundle savedInstanceState) (super.onCreate (savedInstanceState); setContentView (R.layout.activity_second); String user \u003d "Live"; String gift \u003d "donut hole"; TextView infoTextView \u003d (TextView) findViewById R.id.textViewInfo); infoTextView.setText (utilisateur + ", on vous a donné" + cadeau);)

Si nous exécutons le programme maintenant et appelons simplement la deuxième fenêtre, comme décrit dans la première partie de l'article, nous verrons l'étiquette par défaut ZHYVotnoe, on vous a donné un trou de beignet... D'accord, c'est plutôt ennuyeux de recevoir de tels messages.

Nous réparons la situation. Ajoutez le code de la première activité:

Public void onClick (Affichage de la vue) (EditText userEditText \u003d (EditText) findViewById (R.id.editTextUser); EditText giftEditText \u003d (EditText) findViewById (R.id.editTextGift); Intent intent \u003d new Intent (MainActivity) class); // poussez le texte du premier champ de texte dans la clé de nom d'utilisateur intent.putExtra ("username", userEditText.getText (). toString ()); // poussez le texte du deuxième champ de texte dans la clé de cadeau intent.putExtra ("cadeau ", giftEditText.getText (). toString ()); startActivity (intent);)

Nous avons placé un objet dans un conteneur spécial Intention deux clés avec des valeurs tirées des champs de texte. Lorsque l'utilisateur saisit des données dans les champs de texte, il ira dans ce conteneur et sera transféré vers la deuxième activité.

La deuxième activité devrait être prête à recevoir des messages chaleureux comme suit (en gras).

// Valeurs par défaut String user \u003d "Live"; String gift \u003d "trou de beignet"; user \u003d getIntent (). getExtras (). getString ("nom d'utilisateur"); cadeau \u003d getIntent (). getExtras (). getString ("cadeau"); TextView infoTextView \u003d (TextView) findViewById (R.id.textViewInfo); infoTextView.setText (utilisateur + ", vous avez reçu" + cadeau);

Maintenant, le message ne semble pas si offensant, mais même agréable pour certains. Dans les exemples complexes, il est souhaitable d'ajouter une validation lors du traitement des données. Il y a des situations où vous démarrez la deuxième activité avec des données vides comme nulce qui peut planter l'application.

Dans notre cas, nous savons que nous attendons une valeur de chaîne, donc le code peut être réécrit comme ceci:

Intent intent \u003d getIntent (); user \u003d intent.getStringExtra ("nom d'utilisateur");

Utilisateur \u003d getIntent (). GetStringExtra ("nom d'utilisateur");

Le programme a un inconvénient - il n'est pas clair de qui nous recevons les salutations. Tout singe bien élevé n'acceptera pas de cadeau d'une source anonyme. Ainsi, comme devoir à la maison, ajoutez un autre champ de texte pour saisir le nom de l'utilisateur qui envoie le message.

Google recommande d'utiliser le format suivant pour les clés: le nom de votre package comme préfixe, suivi de la clé elle-même. Dans ce cas, vous pouvez être sûr que la clé est unique lors de l'interaction avec d'autres applications. Quelque chose comme ça:

Public final static String USER \u003d "ru.alexanderklimov.myapp.USER";

Qui a encadré le chat Vaska - nous récupérons le résultat

Il ne suffit pas toujours de simplement transmettre des données à une autre activité. Parfois, vous souhaitez récupérer des informations sur une autre activité lorsqu'elle est fermée. Si auparavant nous avons utilisé la méthode startActivity (intention d'intention), alors il y a une méthode connexe startActivityForResult (Intent intent, int RequestCode)... La différence entre les méthodes est le paramètre supplémentaire Code requis... Il s'agit essentiellement d'un entier que vous pouvez créer vous-même. Il est nécessaire pour distinguer de qui provient le résultat. Disons que vous avez cinq écrans supplémentaires et que vous leur attribuez des valeurs de 1 à 5, et à partir de ce code, vous pouvez déterminer le résultat que vous devez traiter. Vous pouvez utiliser la valeur -1, alors ce sera la même chose que l'appel de la méthode startActivity (), c'est à dire. nous n'obtenons aucun résultat.

Si vous utilisez la méthode startActivityForResult (), alors vous devez remplacer la méthode dans le code pour recevoir le résultat onActivityResult () et traitez le résultat. Confus? Prenons un exemple.

Disons que vous êtes un détective. Il y avait des informations selon lesquelles deux morceaux de saucisse et d'autres produits avaient été volés sur la table d'une personne influente dans un restaurant. Les soupçons sont tombés sur trois suspects - un corbeau, un putain de toutou et un chat Vaska.

L'un des visiteurs a fourni une série de photos de son iPhone de ponton:


Il y a aussi le témoignage d'un autre témoin: Et Vaska écoute, mais mange.

Créer un nouveau projet Sherlock avec deux activités. Le premier écran aura un bouton pour passer au deuxième écran et une étiquette de texte qui affichera le nom du voleur.

© 2020 hecc.ru - Actualités des technologies informatiques