24/05/2023
1- Introduction
Android fournit plusieurs méthodes pour faire onSaveInstanceState et onCreate et
6. Persistance 1. Introduction persister les données applicatives: d'utiliser les méthodes qui permettent de
lire/écrire des données sur l'objet Bundle.
des 2. Préférences partagées ● la persistance des données de l'activité, Android fournit aussi automatiquement, la
● un mécanisme de sauvegarde clé/valeur, utilisé persistance du chemin de navigation de
pour les fichiers de préférences (appelé
3. Les fichiers l'utilisateur, ce qui le renvoie à la bonne
données 4. Les bases de données SQLite
préférences partagées)
● des entrées sorties de type fichier
activité lorsqu'il appuie sur la touche Retour.
La navigation vers le parent (bouton "back")
● une base de donnée basé sur SQLite n'est pas automatique car c'est le concepteur
La persistance des données des activités est géré par qui doit décider vers quelle activité
un objet Bundle qui permet de restaurer les View l'application doit retourner quand on appuie
qui possèdent un id. S'il est nécessaire de réaliser sur "back". Elle peut être programmée dans le
une sauvegarde plus personnalisée, il suffit de Manifest avec l'attribut
redéfinir les méthodes android:parentActivityName.
119 120
24/05/2023
2- Préférences Représentation XML d’une page de préférences
La méthode getPreferences(int) appelle en
La classe SharedPreferences permet de fait getPreferences(String, int) à partir du
gérer des paires de clé/valeurs associées à nom de la classe de l'activité courante. Le
une activité. On récupère un tel objet par mode MODE_PRIVATE restreint l'accès au Un fragment spécifique a été programmé <PreferenceScreen
l'appel à getPreferences: xmlns:app="[Link]
fichier créé à l'application. Les modes d'accès pour réaliser un écran d'édition de app:key="first_preferencescreen">
MODE_WORLD_READABLE et préférences. Il s'agit de <SwitchPreferenceCompat
SharedPreferences prefs =
MODE_WORLD_WRITABLE permettent aux app:key="wifi_enabled"
getActivity().getPreferences(Context.MODE_PRIVATE); PreferenceFragmentCompat app:title="WiFi" />
autres applications de lire/écrire ce fichier
Pour avoir des préférences partagées dans (Précédemment PreferenceActivity). A <SwitchPreferenceCompat
(utilisables uniquement avant API 17). app:key="prefer_wifi"
toute l’application, utiliser : partir d'une description XML des app:title="Prefer WiFi" />
... other preferences here ...
.getDefaultSharedPreferences()
L'intérêt d'utiliser le système de préférences préférences, la classe permet d'afficher un
Pour écrire : prévu par Android réside dans le fait que écran composé de modificateurs pour </PreferenceScreen>
[Link] editor = [Link]();
l'interface graphique associé à la modification chaque type de préférences déclarées.
[Link]("login", login);
[Link]();
des préférences est déjà programmé: pas
besoin de créer l'interface de l'activité pour Voici un exemple de déclarations de
Pour lire des préférences :
cela. préférences XML, à stocker dans
String login = [Link]("login", defaultValue);
res/xml/[Link]:
121 122
24/05/2023
SharedPreferences prefs =
[Link](
Activité/Fragment de préférences Attributs des préférences getApplicationContext());
String login = [Link]("login","");
Les attributs suivants sont utiles: Des attributs spécifiques à certains types de
public class SettingsActivity extends AppCompatActivity {
@Override
préférences peuvent être utilisés, par
Pour afficher l'écran d'édition protected void onCreate(Bundle savedInstanceState) { ● app:title: La string apparaissant comme exemple app:summaryOn pour les cases à
[Link](savedInstanceState);
des préférences correspondant setContentView([Link]. settings_activity); nom de la préférence cocher qui donne la chaîne à afficher lorsque
if (savedInstanceState == null) {
getSupportFragmentManager() ● app:summary: Une phrase permettant la préférence est cochée. On peut faire
à sa description XML, il faut .beginTransaction()
.replace([Link]. settings, new SettingsFragment()) d'expliciter la préférence dépendre une préférence d'une autre, à l'aide
créer une nouvelle activité qui .commit();
} ● app:key: La clef pour l'enregistrement de l'attribut app:dependency. Par exemple,
contient un }
de la préférence on peut spécifier dans cet attribut le nom de
PreferenceFragmentCompat public static class SettingsFragment extends PreferenceFragmentCompat {
@Override Les valeurs des préférences, sont accessible
et simplement appeler la public void onCreatePreferences(Bundle savedInstanceState, String la clef d'une préférence de type case à cocher:
rootKey) { via les SharedPreferences avec la méthode
méthode }
setPreferencesFromResource([Link]. preferences, rootKey);
getDefaultSharedPreferences sur la classe <SwitchPreferenceCompat app:key="wifi" ... />
} <EditTextPreference app:dependency="wifi" ... />
setPreferencesFromResource } PreferenceManager. C'est la clef spécifiée
en lui donnant l'id de la par l'attribut android:key qui est utilisée pour
Pour lancer cette activité, on crée un bouton/menu
description XML: récupérer la valeur choisie par l'utilisateur.
et un Intent correspondant, puis lancer avec
startActivity(intent).
123 124
24/05/2023
Exemples: Switch et EditText Exemples: Listes/Options
Une entrée de préférence peut être liée à une liste
Une case à cocher se fait à l'aide de Un champs texte est saisi via qui se déclare dans le menu de
de paires de clef-valeur dans les ressources:
SwitchPreferenceCompat: EditTextPreference: préférences:
<resources>
<SwitchPreferenceCompat <EditTextPreference android:key="login" <ListPreference app:title="Vitesse"
<array name="key"> <!-- Petite=1, Moyenne=5,
app:title="Login utilisateur" app:key="vitesse"
app:summary="Renseigner son login Grande=20 -->
app:key="wifi" app:entries="@array/key"
app:title="Utiliser le wifi" d'authentification." <item>"Petite"</item>
app:entryValues="@array/value"
app:summary="Synchronise l'application via le wifi." app:dialogTitle="Veuillez saisir votre login" <item>"Moyenne"</item>
app:dialogTitle="Choisir la vitesse:"
app:summaryOn="L'application se synchronise via le wifi." /> <item>"Grande"</item>
app:persistent="true">
app:summaryOff="L'application ne se synchronise pas." </array>
</ListPreference>
/> <array name="value">
<item>"1"</item>
<item>"5"</item>
Lorsque l'on choisit la valeur "Petite", la
<item>"20"</item>
</array> préférence vitesse est associée à "1".
</resources>
125 126
24/05/2023
Exercices
Exemples : Lancement d’intent
- Créez une nouvelle Activity - Si l’authentification est réussie transférez
On peut définir un Intent dans une <Preference contenant un champs de texte l’utilisateur directement à une autre
préférence pour lancer un nouveau fragment, app:key=”activity”
“login” un autre pour “mot de
app:title="Ouvrir une autre activité ou
activité. N’oubliez-pas de sauvegarder
une activité ou une autre application chaque
fragment">
passe” et un bouton “entrer” et autologin et le login/pass dans les
fois qu’on appui sur la préférence. Cela
revient à utiliser [Link]() avec <intent android:targetPackage="[Link]" définir cette activité comme point SharedPreferences.
android:targetClass="[Link]" d’entrée à votre application (action
un Intent donné. - Si l’authentification échoue, attendez
/> main + category launcher)
On peut définir un Intent en XML à l'aide </Preference> - Au démarrage de cette activité, que l’utilisateur saisisse à nouveau le
d'une balise <intent> imbriquée. L'exemple vérifier s’il y a des login/pass, enregistrez-les dans
ci-contre définit un Intent qui lance une SharedPreferences avec les clès SharedPreferences et re-tentez
activité:
“autologin” “login” et “passwd” et l’authentification.
consommez le webservice - Ajouter une fenêtre de Préférences pour
d’authentification : désactiver l’autologin.
[Link]
s> 128
127