2011-01-18 12 views
11

Mi aplicación copia archivos desde res/raw a la tarjeta sd en la primera ejecución. Quiero que actualice esos archivos en cada actualización de la aplicación posterior. ¿Cómo puedo hacer que restablezca la primera preferencia en verdadero en cada actualización de la aplicación?Android: ¿Cómo reiniciar FirstRun SharedPreferences cuando mi aplicación se actualiza?

Este es el código correspondiente:

/** 
    * get if this is the first run 
    * 
    * @return returns true, if this is the first run 
    */ 
     public boolean getFirstRun() { 
     return mPrefs.getBoolean("firstRun", true); 
    } 

    /** 
    * store the first run 
    */ 
    public void setRunned() { 
     SharedPreferences.Editor edit = mPrefs.edit(); 
     edit.putBoolean("firstRun", false); 
     edit.commit(); 
    } 

    SharedPreferences mPrefs; 

    /** 
    * setting up preferences storage 
    */ 
    public void firstRunPreferences() { 
     Context mContext = this.getApplicationContext(); 
     mPrefs = mContext.getSharedPreferences("myAppPrefs", 0); //0 = mode private. only this app can read these preferences 
    } 

    public void setStatus(String statustext) { 
     SharedPreferences.Editor edit = mPrefs.edit(); 
     edit.putString("status", statustext); 
     edit.commit(); 
     } 

} 

Respuesta

3

Se podría imitar lo que se hace en el lado de la base de datos, con los números de versión. En lugar de tener solo una variable firstRun, tener un par con firstRun y versionNumber, y poner un campo de número de versión estática en su aplicación, que incremente en cada lanzamiento. De esta manera, podrá verificar si la aplicación se ha actualizado y realizar su operación en cada actualización.

+0

Gracias ¡por tu respuesta! Odio preguntar demasiado ... pero, ¿podrías proporcionar un fragmento de código? Entiendo lo que dices, pero tengo problemas para descubrir cómo implementarlo ... –

+1

@ La respuesta de RivieraKid contiene el tipo de implementación que tenía en mente, creo que puedes usar su respuesta –

20

En mi aplicación, guardo en mis preferencias compartidas el código de versión de la aplicación. En cada inicio, verifico si el código de la versión guardada es más bajo que el código de mi versión actual. Si es así, muestro un diálogo "qué hay de nuevo".

dar a este código de un torbellino - Yo lo uso en onCreate de mi actividad principal:

PackageInfo pInfo; 
    try { 
     pInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_META_DATA); 
     if (prefs.getLong("lastRunVersionCode", 0) < pInfo.versionCode) { 
      // TODO: Handle your first-run situation here 

      Editor editor = prefs.edit(); 
      editor.putLong("lastRunVersionCode", pInfo.versionCode); 
      editor.commit(); 
     } 
    } catch (NameNotFoundException e) { 
     // TODO Something pretty serious went wrong if you got here... 
     e.printStackTrace(); 
    } 

de preferencias es un objeto SharedPreferences privadas. Esto funciona si realmente es la primera vez y para las actualizaciones. Al final del código de la primera ejecución, editor.putLong actualiza tus preferencias compartidas con el código de versión actual de tu aplicación para que la siguiente ejecución no active el código de la primera ejecución.

Esto también se beneficia del hecho de que su código de versión debe aumentar para que la aplicación sea vista como una actualización por el mercado, por lo que no necesita recordar cambiar un valor por separado para detectar la primera ejecución.

1

Soy crear clase para esto; descarga en https://gist.github.com/2509913

Ejemplo Uso:

long versionInstalled = App.getVersionInstalled(this); 
long current_v = App.getVersion(this); 
if(versionInstalled != current_v){ 
    Log.w("TAG", "Veresion not valid"); 
} 
1

Ejecutar este en OnCreate del MainActivity

public void onUpdateFirstRun() { 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    PackageInfo pInfo; 

    try { 
     pInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_META_DATA); 

     Log.d("VersionCode", pInfo.versionCode + " "); 
     if (prefs.getLong(LAST_RUN_VERSION_CODE_KEY, 0) < pInfo.versionCode) { 

      if (!isInitializedInSP(KEY)) { 

       editor.putString(KEY, ""); 
      } 

      //Finalize and Save 
      editor.putLong(LAST_RUN_VERSION_CODE_KEY, pInfo.versionCode); 
      editor.apply(); 

     } 
    } catch (PackageManager.NameNotFoundException e) { 
     e.printStackTrace(); 
    } 
} 

Uso método para comprobar si ya había inicializado que en la versión anterior

public static boolean isInitializedInSP (String key) { 
    SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContex()); 
    Object o = mPrefs.getAll().get(key); 

    if (o != null) { 
     return true; 
    } 
    else { 
     return false; 
    } 

} 
Cuestiones relacionadas