Compruebe si la aplicación está en su primera ejecución

Soy nuevo en el desarrollo de Android y quiero configurar algunos de los atributos de la aplicación basados ​​en la primera ejecución de la aplicación después de la instalación. ¿Hay alguna manera de encontrar que la aplicación se está ejecutando por primera vez y luego configurar sus primeros atributos de ejecución?

El siguiente es un ejemplo del uso de SharedPreferences para lograr una verificación de ‘primera ejecución’.

 public class MyActivity extends Activity { SharedPreferences prefs = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Perhaps set content view here prefs = getSharedPreferences("com.mycompany.myAppName", MODE_PRIVATE); } @Override protected void onResume() { super.onResume(); if (prefs.getBoolean("firstrun", true)) { // Do first run stuff here then set 'firstrun' as false // using the following line to edit/commit prefs prefs.edit().putBoolean("firstrun", false).commit(); } } } 

Cuando el código se ejecuta prefs.getBoolean(...) si no hay un boolean guardado en SharedPreferences con la clave “firstrun”, eso indica que la aplicación nunca se ha ejecutado (porque nada ha guardado nunca un booleano con esa clave o el el usuario ha borrado los datos de la aplicación para forzar un escenario de ‘primera ejecución’). Si esta no es la primera ejecución, entonces la línea prefs.edit().putBoolean("firstrun", false).commit(); se habrá ejecutado y, por prefs.getBoolean("firstrun", true) tanto, prefs.getBoolean("firstrun", true) realidad devolverá false ya que anula el valor predeterminado true proporcionado como el segundo parámetro.

La respuesta aceptada no diferencia entre una primera ejecución y actualizaciones posteriores. El solo hecho de configurar un valor booleano en las preferencias compartidas solo le dirá si es la primera vez que se ejecuta la aplicación por primera vez. Más tarde, si desea actualizar su aplicación y realizar algunos cambios en la primera ejecución de esa actualización, ya no podrá usar ese booleano porque las preferencias compartidas se guardan en las actualizaciones.

Este método usa preferencias compartidas para guardar el código de la versión en lugar de un booleano.

 import com.yourpackage.BuildConfig; ... private void checkFirstRun() { final String PREFS_NAME = "MyPrefsFile"; final String PREF_VERSION_CODE_KEY = "version_code"; final int DOESNT_EXIST = -1; // Get current version code int currentVersionCode = BuildConfig.VERSION_CODE; // Get saved version code SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); int savedVersionCode = prefs.getInt(PREF_VERSION_CODE_KEY, DOESNT_EXIST); // Check for first run or upgrade if (currentVersionCode == savedVersionCode) { // This is just a normal run return; } else if (savedVersionCode == DOESNT_EXIST) { // TODO This is a new install (or the user cleared the shared preferences) } else if (currentVersionCode > savedVersionCode) { // TODO This is an upgrade } // Update the shared preferences with the current version code prefs.edit().putInt(PREF_VERSION_CODE_KEY, currentVersionCode).apply(); } 

Probablemente llamarás a este método desde onCreate en tu actividad principal para que se compruebe cada vez que se inicie tu aplicación.

 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); checkFirstRun(); } private void checkFirstRun() { // ... } } 

Si lo necesita, puede ajustar el código para hacer cosas específicas según la versión que el usuario haya instalado previamente.

Idea vino de esta respuesta . Estos también son útiles:

  • ¿Cómo puede obtener el número de versión de manifiesto de las variables XML de la aplicación (diseño)?
  • Nombre de la versión del usuario de AndroidManifest.xml en el código

Si tiene problemas para obtener el código de la versión, consulte las siguientes preguntas y respuestas:

  • ¿Cómo obtener el número de comstackción / versión de su aplicación Android?
  import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.RandomAccessFile; import java.util.UUID; import android.content.Context; public class Util { // =========================================================== // // =========================================================== private static final String INSTALLATION = "INSTALLATION"; public synchronized static boolean isFirstLaunch(Context context) { String sID = null; boolean launchFlag = false; if (sID == null) { File installation = new File(context.getFilesDir(), INSTALLATION); try { if (!installation.exists()) { launchFlag = true; writeInstallationFile(installation); } sID = readInstallationFile(installation); } catch (Exception e) { throw new RuntimeException(e); } } return launchFlag; } private static String readInstallationFile(File installation) throws IOException { RandomAccessFile f = new RandomAccessFile(installation, "r");// read only mode byte[] bytes = new byte[(int) f.length()]; f.readFully(bytes); f.close(); return new String(bytes); } private static void writeInstallationFile(File installation) throws IOException { FileOutputStream out = new FileOutputStream(installation); String id = UUID.randomUUID().toString(); out.write(id.getBytes()); out.close(); } } > Usage (in class extending android.app.Activity) Util.isFirstLaunch(this); 

No hay forma de saberlo a través de la API de Android. SharedPreferenceEditor un SharedPreferenceEditor usted mismo y hacerlo persistir en un SharedPreferenceEditor o utilizando una base de datos.

Si desea basar algunas cosas relacionadas con la licencia en este indicador, le sugiero que utilice un editor de preferencias ofuscado proporcionado por la biblioteca LVL. Es simple y limpio.

Saludos, Stephane

Solo verifique alguna preferencia con valor predeterminado que indique que es la primera vez. Entonces, si obtiene el valor predeterminado, realice su inicialización y establezca esta preferencia en un valor diferente para indicar que la aplicación ya se ha inicializado.

El siguiente es un ejemplo del uso de SharedPreferences para lograr una verificación ‘forWhat’.

  preferences = PreferenceManager.getDefaultSharedPreferences(context); preferencesEditor = preferences.edit(); public static boolean isFirstRun(String forWhat) { if (preferences.getBoolean(forWhat, true)) { preferencesEditor.putBoolean(forWhat, false).commit(); return true; } else { return false; } } 

No hay una manera confiable de detectar la primera ejecución, ya que las preferencias compartidas no siempre son seguras, ¡el usuario puede eliminar los datos de preferencias compartidas de la configuración! una mejor manera es usar las respuestas aquí. ¿Hay una ID de dispositivo Android única? para obtener el ID único del dispositivo y almacenarlo en algún lugar de su servidor, de modo que cada vez que el usuario inicie la aplicación, solicite el servidor y verifique si está allí en su base de datos o si es nuevo.

No estoy seguro de que sea una buena forma de verificarlo. ¿Qué pasa con el caso cuando el usuario usa el botón “borrar datos” desde la configuración? Las Preferencias compartidas se borrarán y se detectará “primera vez”. Y es un problema Supongo que es mejor idea usar InstallReferrerReceiver .

Esto podría ayudarte

 public class FirstActivity extends Activity { SharedPreferences sharedPreferences = null; Editor editor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); sharedPreferences = getSharedPreferences("com.myAppName", MODE_PRIVATE); } @Override protected void onResume() { super.onResume(); if (sharedPreferences.getBoolean("firstRun", true)) { //You can perform anything over here. This will call only first time editor = sharedPreferences.edit(); editor.putBoolean("firstRun", false) editor.commit(); } } } 
 SharedPreferences mPrefs; final String welcomeScreenShownPref = "welcomeScreenShown"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mPrefs = PreferenceManager.getDefaultSharedPreferences(this); // second argument is the default to use if the preference can't be found Boolean welcomeScreenShown = mPrefs.getBoolean(welcomeScreenShownPref, false); if (!welcomeScreenShown) { // here you can launch another activity if you like SharedPreferences.Editor editor = mPrefs.edit(); editor.putBoolean(welcomeScreenShownPref, true); editor.commit(); // Very important to save the preference } }