Accueil / Articles PiApplications. / La plate-forme Android / Partage de données.

Données : les préférences partagées.

Les "préférences partagées" est un moyen simple de partager des données entre activités. Une préférence partagée est une "propriété" enregistrée dans une liste en mémoire. Cette liste de propriétés peut être automatiquement sauvegardée dans un fichier XML et est appelée liste de "préférences partagées". Pour que le mécanisme soit transparent, un certain nombre de conventions sont faites :

La classe sui représente les données partagées se nomme SharedPreferences. On y accède via l'objet de classe Context et sa méthode getSharedPreferences(String sName, int iAccessMode). On rappelle ici que la classe Activity dérive de la classe Context. Le paramètre sName indique le nom du fichier qui enregistre ces données. Si au moment de l'invocation de la méthode, le fichier n'existe pas, il est alors créé.

Création des préférences partagées.

La paramètre iAccessMode indique les permissions que vous donnez à ce fichier. Voici un exemple d'emploi des préférences partagées :

public class SharedPrefInputProto extends Activity
{
  public static final String PREFS_PRIVATE = "PREFS_PRIVATE";
  public static final String PREFS_WORLD_READ = "PREFS_WORLD_READABLE";
  public static final String PREFS_WORLD_WRITE = "PREFS_WORLD_WRITABLE";
  public static final String PREFS_WORLD_READ_WRITE = "PREFS_WORLD_READABLE_WRITABLE";
  public static final String KEY_PRIVATE = "KEY_PRIVATE";
  public static final String KEY_WORLD_READ = "KEY_WORLD_READ";
  public static final String KEY_WORLD_WRITE = "KEY_WORLD_WRITE";
  public static final String KEY_WORLD_READ_WRITE = "KEY_WORLD_READ_WRITE";

  ...Omission des déclarations de variable pour faire court

  private SharedPreferences prefsPrivate;
  private SharedPreferences prefsWorldRead;
  private SharedPreferences prefsWorldWrite;
  private SharedPreferences prefsWorldReadWrite;

  @Override
  public void onCreate(Bundle icicle)
  {
    ...Omission d'instructions dans un souci de concision

    button.setOnClickListener(new OnClickListener()
    {
     public void onClick(final View v)
     {
       boolean valid = validate();
       if (valid)
       {
         prefsPrivate = getSharedPreferences(SharedPrefTestInput.PREFS_PRIVATE, Context.MODE_PRIVATE);
         prefsWorldRead = getSharedPreferences(SharedPrefTestInput.PREFS_WORLD_READ, Context.MODE_WORLD_READABLE);
         prefsWorldWrite = getSharedPreferences(SharedPrefTestInput.PREFS_WORLD_WRITE, Context.MODE_WORLD_WRITEABLE);
         prefsWorldReadWrite = getSharedPreferences(SharedPrefTestInput.PREFS_WORLD_READ_WRITE, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
         Editor prefsPrivateEditor = prefsPrivate.edit();
         Editor prefsWorldReadEditor = prefsWorldRead.edit();
         Editor prefsWorldWriteEditor = prefsWorldWrite.edit();
         Editor prefsWorldReadWriteEditor = prefsWorldReadWrite.edit();
         prefsPrivateEditor.putString(SharedPrefTestInput.KEY_PRIVATE, inputPrivate.getText.toString());
         prefsWorldReadEditor.putString(SharedPrefTestInput.KEY_WORLD_READ, inputWorldRead.getText().toString());
         prefsWorldWriteEditor.putString( SharedPrefTestInput.KEY_WORLD_WRITE, inputWorldWrite.getText().toString());
         prefsWorldReadWriteEditor.putString( SharedPrefTestInput.KEY_WORLD_READ_WRITE, inputWorldReadWrite.getText().toString());
         prefsPrivateEditor.commit();
         prefsWorldReadEditor.commit();
         prefsWorldWriteEditor.commit();
         prefsWorldReadWriteEditor.commit();
         Intent intent = new Intent(SharedPrefTestInput.this, SharedPrefTestOutput.class);
         startActivity(intent);
       }
     });
    }
  }
  ...Validation omise dans un souci de concision
}

Pour modifier les préférences, vous devez utiliser un objet de classe Editor. Cette objet créé une carte (Map) en mémoire. Il faut invoquer la méthode commit pour la rendre persistante. Les droits ressemblent à ceux du système de fichier UNIX ou WORLD signifie "les autres" (public) et PRIVATE "utilisateur" et "groupe".

Physiquement, les données sont placées dans des fichiers XML sur un sous-répertoire nommé "shared_prefs" lui même placé sur un sous-répertoire du nom du package. Tous ces sous-répertorie sont traversables (droit "x") quel que soit le mode d'accès fixé. Le fichier prend pour nom d'utilisateur l'identifiant numérique de l'application.

Lecture de données issues de préférences partagées.

Comme pour la création des données, la lecture repose sur un objet de la classe Context. Il faut en outre avoir connaissance du package qui a créé le fichier des préférences partagées. Voici un exemple de lecture :

public class SharedPrefOutputProto extends Activity
{
  ...déclarations des constantes et variables omises dans un souci de concision

  @Override
  public void onStart()
  {
    super.onStart();
    Context otherAppsContext = null;
    try
    {
      otherAppsContext = createPackageContext("/*nom du package java qui a créé le fichier*/", Context.MODE_WORLD_WRITEABLE);
    }
    catch (NameNotFoundException nfe)
    {
      // trace et gestion de l'exception
    }
    prefsPrivate = otherAppsContext.getSharedPreferences(SharedPrefTestOtherOutput.PREFS_PRIVATE, 0);
    prefsWorldRead = otherAppsContext.getSharedPreferences(SharedPrefTestOtherOutput.PREFS_WORLD_READ, 0);
    prefsWorldWrite = otherAppsContext.getSharedPreferences(SharedPrefTestOtherOutput.PREFS_WORLD_WRITE, 0);
    prefsWorldReadWrite = otherAppsContext.getSharedPreferences(SharedPrefTestOtherOutput.PREFS_WORLD_READ_WRITE, 0);
    outputPrivate.setText(prefsPrivate.getString(SharedPrefTestOtherOutput.KEY_PRIVATE, "NA"));
    outputWorldRead.setText(prefsWorldRead.getString(SharedPrefTestOtherOutput.KEY_WORLD_READ, "NA"));
    outputWorldWrite.setText(prefsWorldWrite.getString(SharedPrefTestOtherOutput.KEY_WORLD_WRITE, "NA"));
    outputWorldReadWrite.setText(prefsWorldReadWrite.getString(SharedPrefTestOtherOutput.KEY_WORLD_READ_WRITE,"NA"));
  }
}

Notez que comme les préférences partagées sont physiquement des fichiers XML, il est également possible de les manipuler directement.

(c) PiApplications 2016