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

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

preguntado el 27 de agosto de 11 a las 21:08

10 Respuestas

El siguiente es un ejemplo de uso SharedPreferences para lograr una comprobació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 se ejecuta el código prefs.getBoolean(...) si no hay un boolean guardado en SharedPreferences con la tecla "firstrun", eso indica que la aplicación nunca se ha ejecutado (porque nada ha guardado un valor booleano con esa clave o el usuario ha borrado los datos de la aplicación para forzar un escenario de 'primera ejecución'). Si esta no es la primera vez, entonces la línea prefs.edit().putBoolean("firstrun", false).commit(); habrá sido ejecutado y por lo tanto prefs.getBoolean("firstrun", true) en realidad devolverá falso ya que anula el verdadero predeterminado proporcionado como segundo parámetro.

Respondido 14 Jul 17, 15:07

@Squonk ¿Puede decirme el beneficio de poner el código por separado tanto en onCreate () como en onResume ()? - Ken Ratanachai S.

Por curiosidad, ¿por qué la parte donde usamos putBoolean in onResume()? ¿Por qué no puede ser esto en el onCreate() ¿función? - James Heald

A pesar de que prefiero La respuesta de Suragch, esto funciona bien. De todos modos, una observación menor es que el valor de firstrun, cuando exista, siempre será false. A pesar de que este valor realmente no importa, es más común y convencional esperar false como valor predeterminado de un booleano. Si usara este enfoque, usaría un appHasRunBefore preferencia de la siguiente manera if (prefs.getBoolean("appHasRunBefore", false)){ /* This is not the first run */} else { /* Do first run stuff */ prefs.edit().putBoolean("appHasRunBefore", true).commit(); } - Diana

Hola, ¿qué pasa si el usuario borra los datos de la aplicación? Los datos de preferencias compartidas se borrarán, ¿verdad? - ANUJ GUPTA

Esto no funcionará si la aplicación ha configurado android: allowBackup = "true" (que de forma predeterminada se establece en true) y la preferencia compartida se restaura en la instalación después de la desinstalación mientras la copia de seguridad está habilitada en el dispositivo. Así que también asegúrese de configurar android: allowBackup = "false" en AndroidManifest.xml. - Ashwin

La respuesta aceptada no diferencia entre una primera ejecución y actualizaciones posteriores. El simple hecho de establecer un valor booleano en las preferencias compartidas solo le dirá si es la primera vez que se ejecuta después de que la aplicación se instala por primera vez. Más adelante, 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 entre las actualizaciones.

Este método utiliza 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ías a este método desde onCreate en su actividad principal para que se verifique cada vez que se inicie su 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 anteriormente.

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

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

respondido 17 mar '18, 11:03

+1 por considerar la actualización, pero también por brindar una solución más elegante que tener una preferencia cuyo valor realmente no importa (ya que firstrun, si existe, siempre sería false). También personalmente creo que esperar true como valor predeterminado para una preferencia (cuando no está presente) no es tan intuitivo y debe evitarse cuando sea posible. - Diana

si comprueba el valor predeterminado de share Preference Boolean como FALSE y comprueba si el valor es False, hágalo VERDADERO, seguirá siendo cierto si actualiza la aplicación hasta que la desinstale o borre el caché - Nouman Shah

    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);

Respondido el 02 de junio de 15 a las 13:06

No hay forma de saberlo a través de la API de Android. Tienes que almacenar alguna bandera por ti mismo y hacer que persista en un SharedPreferenceEditor o usando una base de datos.

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

Saludos, Stephane

Respondido 28 ago 11, 05:08

No estoy seguro de que sea una buena forma de comprobarlo. ¿Qué pasa con el caso cuando el usuario utiliza el botón "borrar datos" de la configuración? Las preferencias compartidas se borrarán y volverá a detectar la "primera ejecución". Y es un problema. Supongo que es mejor idea usar InstallReferrerReceiver.

Respondido el 12 de enero de 17 a las 11:01

Ha señalado correctamente el problema que surge de los "datos claros" que nadie ha abordado. ¿Cómo puede funcionar su solución cuando la aplicación se carga lateralmente? - vj

Simplemente verifique alguna preferencia con el valor predeterminado que indica que es una primera ejecución. 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 está inicializada.

Respondido 28 ago 11, 01:08

Hmm está bien ... Soy nuevo en Android, así que creo que primero tengo que estudiar las preferencias ... gracias de todos modos - Waneya Iqbal

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;
    }
}

Respondido 26 Jul 16, 20:07

No existe una forma confiable de detectar la primera ejecución, ya que la forma de preferencias compartidas no siempre es segura, ¡el usuario puede eliminar los datos de preferencias compartidas de la configuración! una mejor manera es usar las respuestas aquí ¿Existe un ID de dispositivo Android único? para obtener la identificación única del dispositivo y almacenarla en algún lugar de su servidor, por lo que cada vez que el usuario inicia la aplicación, solicita el servidor y verifica si está en su base de datos o si es nuevo.

contestado el 23 de mayo de 17 a las 14:05

¿Qué pasa si el usuario desinstala y vuelve a instalar? ¿Qué pasa cuando el usuario actualiza? - Suragch

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

    }
}

Respondido 18 Abr '17, 16:04

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();

        }
    }
}

respondido 16 mar '16, 10:03

Google dice "Tu aplicación puede escuchar la transmisión Intent.ACTION_PACKAGE_FIRST_LAUNCH del sistema para identificar la primera ejecución de la aplicación". Aquí developer.android.com/google/play/installreferrer/library . Pero lucho por hacer eso ya que parece que no hay una intención de transmisión, excepto cuando se instala desde Google Play, - Dan Alboteanu

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.