Articles récents
Android : Les intentions
Le framework android propose un outil de communication spécifique dédié à la réalisation d'une action, ce sont les intentions. Ce mécanisme permet à Android de gérer au mieux les ressources du système. En gros la philosophie est : on propose une intention, et le système, en fonction de sa capacité, la réalise.
L'intention est la méthode à privilégier pour réaliser une action définie. Voyons comment cela fonctionne précisément.
1)Principe et réalisation
Le framework Java d'Android définit une classe Intent, qui précise les échanges avec le système JAVA ou avec l'activité, voir l'application. Il existe deux types d'intentions:
Les intentions sont utilisées pour: |
1.1)Lancer une activité dans l'application courante
L'intention est la meilleure méthode pour ouvrir une vue et donc une activité. Pour cela, on instancie un objet Intent en précisant la classe de l'activité à ouvrir. Attention à ne pas oublier de préciser dans l'application définie dans le fichier manifest la nouvelle activité. Voici un exemple de code pour lancer une activité dans l'application courante.Il faut créer la nouvelle activité à ouvrir:
On définit son layout par new_vue.xml:
Ensuite, dans l'activité principale, on créé un bouton qui permettera d'ouvrir l'activité dite fille:
Le layout de l'activité principale:
Enfin, il est nécessaire de déclarer l'activité dans le fichier manifest:
Donc lorsque l'on clique sur le bouton, l'activité fille s'ouvre.
1.2)Lancer une activité avec résultat
Souvent on demande à une activité fille de retourner un résultat à l'activité principale. Pour cela, on utilisera la méthode startActivityForResult() qui transmet le résultat lorsque l'activité se termine. Dans l'application fille, la méthode setResult() doit permettre de retourner la valeur. Enfin, dans l'application principale, la méthode onActivityResult() traite la réception de l'information.Nous allons prendre pour exemple une application fille qui doit renvoyer à l'application principale une validation ou une annulation.
D'abord, on retouche légèrement la vue de l'application fille pour obtenir deux boutons de retours, un pour la validation et un autre pour l'annulation:
Ensuite, on code l'activité secondaire:
Enfin l'activité principale avec la fonction de gestion des retours onActivityResult():
2)Lancement d'une application externe
Il est possible également de lancer une application externe. On utilise pour cela les intentions implicites. Dans ce cas, c'est le système qui choisit l'application qui sera lancée.Voici un exemple pour lancer l'application téléphone sur un numéro défini:
Les intentions implicites désignent des actions prédéfinies qui sont connus du framework Android. Voici quelques actions :
Attention, certaines application nécessitent la paramétrage de permissions dans le fichier manifest.
3)Transmettre des données
Il est possible de transmettre des données en utilisant les fonctions putExtra() et getExtras().
Donc dans l'activité principale:
Intent intent=new Intent(this,NewActivity.class);
intent.putExtra("variable","ma valeur");
startActivityForResult(intent, NUM_ACTIVITY);
Et pour récupérer la variable transmise dans l'activité secondaire:
//Récupération de la variable
Bundle extra=this.getIntent().getExtras();
if (extra!=null){
String str=extra.getString("variable");
Toast toast=Toast.makeText(this,str,Toast.LENGTH_LONG);
toast.show();
}
4)Le Broadcast Receiver
Le système Android permet de transmettre des intentions en broadcast, c'est à dire à toutes les applications qui sont en écoute. Les intentions sont utiles pas seulement pour lancer une activité, mais aussi pour transmettre des informations comme nous l'avons précédemment décrit. Notamment, on l'utilise pour transmettre des informations liées au système Android (réseaux disponibles, ...).
4.1) Transmettre une information par un broadcast intent
Pour transmettre, une information en broadcast, on transmet en broadcast une intention par la méthode sendBroadcast(). Cette méthode demande en paramètre le nom de l'intention à diffuser, il suffira donc d'ajouter l'information à transmettre dans l'intention au préalable de la diffusion.
Voici un exemple où il suffit d'appuyer sur un bouton pour transmettre l'intention et l'information associée.
package fr.doritique.testbroadcastreceiver;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.app.Activity;
import android.content.Intent;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = (Button) findViewById(R.id.MyBtn);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
AfficheBR();
}
});
}
protected void AfficheBR() {
Intent intent=new Intent(MyBR.VIEW);
intent.putExtra("extra", "le message");
sendBroadcast(intent);
}
}
4.2)Récupération de l'information diffusée
Pour cela, il suffit de créer un Broadcast Receiver qui se chargera de récupérer les réception d'intention diffusée.
Pour créer notre Broadcast Receiver, il suffit de créer une classe JAVA, de la faire hériter de la classe BroadcastReceiver, et de surcharger la méthode onReceive(Context context,Intent intent) chargée de traiter la réception du message.
L'exemple ci-dessous propose une solution pour créer un Broadcast Receiver qui affieche les messages receptionnés.
package fr.doritique.testbroadcastreceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public final class MyBR extends BroadcastReceiver {
public static final String VIEW="doritique.intent.action.VIEW";
@Override
public void onReceive(Context context, Intent intent) {
String str=intent.getExtras().getString("extra");
Affiche(context,str);
}
protected void Affiche(Context context,String str) {
Toast toast=Toast.makeText(context,"Réception du message transmis en broadcast : "
+str,Toast.LENGTH_LONG);
toast.show();
}
}
Ce qui donnera:
Attention, il faut déclarer notre récepteur dans le fichier manifest:
Cette déclaration du récepteur est dite statique, il est possible de créer ses récepteurs sans passer par une déclaration dans le fichier manifest. Ce mode dynamique est possible en enregistrant le récepteur lors de l’exécution du programme, on utilisera alors les méthodes registerReceiver() et unregisterReceiver().
Voici un exemple de déclaration dynamique d'un récepteur:
package fr.doritique.testbroadcastreceiverdynamique;
import com.example.testbroadcastreceiverdynamique.R;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
public class MainActivity extends Activity {
public MyBR receiver;
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
receiver=new MyBR();
IntentFilter filter=new IntentFilter(MyBR.VIEW);
registerReceiver(receiver, filter);
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
unregisterReceiver(receiver);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = (Button) findViewById(R.id.MyBtn);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
AfficheBR();
}
});
}
protected void AfficheBR() {
Intent intent=new Intent(MyBR.VIEW);
intent.putExtra("extra", "le message");
sendBroadcast(intent);
}
}
Conclusion
L'intention est la méthode privilégiée pour ouvrir une vue, pour transmettre une information ou pour ouvrir une application externe en mode implicite. C'est un outil indispensable du dévellopeur d'application Android.
© 2024 www.doritique.fr par Robert DORIGNY