Actualmente estoy desarrollando una aplicación para Android. Necesito hacer algo cuando la aplicación se inicia por primera vez, es decir, el código solo se ejecuta la primera vez que se inicia el programa.
Actualmente estoy desarrollando una aplicación para Android. Necesito hacer algo cuando la aplicación se inicia por primera vez, es decir, el código solo se ejecuta la primera vez que se inicia el programa.
Respuestas:
Otra idea es utilizar una configuración en las preferencias compartidas. La misma idea general que buscar un archivo vacío, pero luego no tiene un archivo vacío flotando, no se usa para almacenar nada
Puede utilizar SharedPreferences para identificar si es la "primera vez" que se inicia la aplicación. Simplemente use una variable booleana ("my_first_time") y cambie su valor a falso cuando su tarea por "primera vez".
Este es mi código para capturar la primera vez que abre la aplicación:
final String PREFS_NAME = "MyPrefsFile";
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
if (settings.getBoolean("my_first_time", true)) {
//the app is being launched for first time, do something
Log.d("Comments", "First time");
// first time task
// record the fact that the app has been started at least once
settings.edit().putBoolean("my_first_time", false).commit();
}
Sugiero no solo almacenar una bandera booleana, sino el código de versión completo. De esta forma también puede consultar al principio si es el primer inicio en una nueva versión. Puede utilizar esta información para mostrar un cuadro de diálogo "Novedades", por ejemplo.
El siguiente código debería funcionar desde cualquier clase de Android que "sea un contexto" (actividades, servicios, ...). Si prefiere tenerlo en una clase separada (POJO), podría considerar usar un "contexto estático", como se describe aquí, por ejemplo.
/**
* Distinguishes different kinds of app starts: <li>
* <ul>
* First start ever ({@link #FIRST_TIME})
* </ul>
* <ul>
* First start in this version ({@link #FIRST_TIME_VERSION})
* </ul>
* <ul>
* Normal app start ({@link #NORMAL})
* </ul>
*
* @author schnatterer
*
*/
public enum AppStart {
FIRST_TIME, FIRST_TIME_VERSION, NORMAL;
}
/**
* The app version code (not the version name!) that was used on the last
* start of the app.
*/
private static final String LAST_APP_VERSION = "last_app_version";
/**
* Finds out started for the first time (ever or in the current version).<br/>
* <br/>
* Note: This method is <b>not idempotent</b> only the first call will
* determine the proper result. Any subsequent calls will only return
* {@link AppStart#NORMAL} until the app is started again. So you might want
* to consider caching the result!
*
* @return the type of app start
*/
public AppStart checkAppStart() {
PackageInfo pInfo;
SharedPreferences sharedPreferences = PreferenceManager
.getDefaultSharedPreferences(this);
AppStart appStart = AppStart.NORMAL;
try {
pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
int lastVersionCode = sharedPreferences
.getInt(LAST_APP_VERSION, -1);
int currentVersionCode = pInfo.versionCode;
appStart = checkAppStart(currentVersionCode, lastVersionCode);
// Update version in preferences
sharedPreferences.edit()
.putInt(LAST_APP_VERSION, currentVersionCode).commit();
} catch (NameNotFoundException e) {
Log.w(Constants.LOG,
"Unable to determine current app version from pacakge manager. Defenisvely assuming normal app start.");
}
return appStart;
}
public AppStart checkAppStart(int currentVersionCode, int lastVersionCode) {
if (lastVersionCode == -1) {
return AppStart.FIRST_TIME;
} else if (lastVersionCode < currentVersionCode) {
return AppStart.FIRST_TIME_VERSION;
} else if (lastVersionCode > currentVersionCode) {
Log.w(Constants.LOG, "Current version code (" + currentVersionCode
+ ") is less then the one recognized on last startup ("
+ lastVersionCode
+ "). Defenisvely assuming normal app start.");
return AppStart.NORMAL;
} else {
return AppStart.NORMAL;
}
}
Podría usarse a partir de una actividad como esta:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
switch (checkAppStart()) {
case NORMAL:
// We don't want to get on the user's nerves
break;
case FIRST_TIME_VERSION:
// TODO show what's new
break;
case FIRST_TIME:
// TODO show a tutorial
break;
default:
break;
}
// ...
}
// ...
}
La lógica básica se puede verificar usando esta prueba JUnit:
public void testCheckAppStart() {
// First start
int oldVersion = -1;
int newVersion = 1;
assertEquals("Unexpected result", AppStart.FIRST_TIME,
service.checkAppStart(newVersion, oldVersion));
// First start this version
oldVersion = 1;
newVersion = 2;
assertEquals("Unexpected result", AppStart.FIRST_TIME_VERSION,
service.checkAppStart(newVersion, oldVersion));
// Normal start
oldVersion = 2;
newVersion = 2;
assertEquals("Unexpected result", AppStart.NORMAL,
service.checkAppStart(newVersion, oldVersion));
}
Con un poco más de esfuerzo, probablemente también podría probar las cosas relacionadas con Android (PackageManager y SharedPreferences). ¿Alguien interesado en escribir la prueba? :)
Tenga en cuenta que el código anterior solo funcionará correctamente si no se mete con su android:versionCodeen AndroidManifest.xml.
public AppStart checkAppStart(Context context, SharedPreferences sharedPreferences)es una firma de método mucho mejor
checkAppStartbloque. así que decidí compartir mi código actualizado y ver si alguien tiene sugerencias al respecto
AppStartdesde diferentes actividades. Así que puse la lógica en un método de servicio separado. Es por eso que había una contextvariable y AppStartse almacenaba dentro de una variable estática para facilitar las llamadas a métodos idempotentes.
Resolví determinar si la aplicación es tu primera vez o no, dependiendo de si es una actualización.
private int appGetFirstTimeRun() {
//Check if App Start First Time
SharedPreferences appPreferences = getSharedPreferences("MyAPP", 0);
int appCurrentBuildVersion = BuildConfig.VERSION_CODE;
int appLastBuildVersion = appPreferences.getInt("app_first_time", 0);
//Log.d("appPreferences", "app_first_time = " + appLastBuildVersion);
if (appLastBuildVersion == appCurrentBuildVersion ) {
return 1; //ya has iniciado la appp alguna vez
} else {
appPreferences.edit().putInt("app_first_time",
appCurrentBuildVersion).apply();
if (appLastBuildVersion == 0) {
return 0; //es la primera vez
} else {
return 2; //es una versión nueva
}
}
}
Calcular resultados:
Puede utilizar Preferencias compartidas de Android .
Android SharedPreferences nos permite almacenar datos de aplicaciones primitivas privadas en forma de par clave-valor.
CÓDIGO
Crear una clase personalizada SharedPreference
public class SharedPreference {
android.content.SharedPreferences pref;
android.content.SharedPreferences.Editor editor;
Context _context;
private static final String PREF_NAME = "testing";
// All Shared Preferences Keys Declare as #public
public static final String KEY_SET_APP_RUN_FIRST_TIME = "KEY_SET_APP_RUN_FIRST_TIME";
public SharedPreference(Context context) // Constructor
{
this._context = context;
pref = _context.getSharedPreferences(PREF_NAME, 0);
editor = pref.edit();
}
/*
* Set Method Generally Store Data;
* Get Method Generally Retrieve Data ;
* */
public void setApp_runFirst(String App_runFirst)
{
editor.remove(KEY_SET_APP_RUN_FIRST_TIME);
editor.putString(KEY_SET_APP_RUN_FIRST_TIME, App_runFirst);
editor.apply();
}
public String getApp_runFirst()
{
String App_runFirst= pref.getString(KEY_SET_APP_RUN_FIRST_TIME, "FIRST");
return App_runFirst;
}
}
Ahora abra su actividad e inicialice .
private SharedPreference sharedPreferenceObj; // Declare Global
Ahora llame a esto en la sección OnCreate
sharedPreferenceObj=new SharedPreference(YourActivity.this);
Ahora comprobando
if(sharedPreferenceObj.getApp_runFirst().equals("FIRST"))
{
// That's mean First Time Launch
// After your Work , SET Status NO
sharedPreferenceObj.setApp_runFirst("NO");
}
else
{
// App is not First Time Launch
}
Aquí hay un código para esto:
String path = Environment.getExternalStorageDirectory().getAbsolutePath() +
"/Android/data/myapp/files/myfile.txt";
boolean exists = (new File(path)).exists();
if (!exists) {
doSomething();
}
else {
doSomethingElse();
}
Simplemente puede verificar la existencia de un archivo vacío, si no existe, luego ejecute su código y cree el archivo.
p.ej
if(File.Exists("emptyfile"){
//Your code here
File.Create("emptyfile");
}
¡Hice una clase simple para verificar si su código se está ejecutando por primera vez / n veces!
Ejemplo
Crea preferencias únicas
FirstTimePreference prefFirstTime = new FirstTimePreference(getApplicationContext());
Use runTheFirstTime, elija una clave para verificar su evento
if (prefFirstTime.runTheFirstTime("myKey")) {
Toast.makeText(this, "Test myKey & coutdown: " + prefFirstTime.getCountDown("myKey"),
Toast.LENGTH_LONG).show();
}
Use runTheFirstNTimes, elija una clave y cuántas veces ejecutar
if(prefFirstTime.runTheFirstNTimes("anotherKey" , 5)) {
Toast.makeText(this, "ciccia Test coutdown: "+ prefFirstTime.getCountDown("anotherKey"),
Toast.LENGTH_LONG).show();
}
Solo hay soporte para esto en la revisión de la biblioteca de soporte 23.3.0 (en la v4, lo que significa compatibilidad con Android 1.6).
En su actividad de Lanzador, primero llame a:
AppLaunchChecker.onActivityCreate(activity);
Luego llame:
AppLaunchChecker.hasStartedFromLauncher(activity);
Que volverá si esta fue la primera vez que se lanzó la aplicación.
Si buscas una forma sencilla, aquí la tienes.
Cree una clase de utilidad como esta,
public class ApplicationUtils {
/**
* Sets the boolean preference value
*
* @param context the current context
* @param key the preference key
* @param value the value to be set
*/
public static void setBooleanPreferenceValue(Context context, String key, boolean value) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().putBoolean(key, value).apply();
}
/**
* Get the boolean preference value from the SharedPreference
*
* @param context the current context
* @param key the preference key
* @return the the preference value
*/
public static boolean getBooleanPreferenceValue(Context context, String key) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(key, false);
}
}
En su actividad principal, onCreate ()
if(!ApplicationUtils.getBooleanPreferenceValue(this,"isFirstTimeExecution")){
Log.d(TAG, "First time Execution");
ApplicationUtils.setBooleanPreferenceValue(this,"isFirstTimeExecution",true);
// do your first time execution stuff here,
}
para kotlin
fun checkFirstRun() {
var prefs_name = "MyPrefsFile"
var pref_version_code_key = "version_code"
var doesnt_exist: Int = -1;
// Get current version code
var currentVersionCode = BuildConfig.VERSION_CODE
// Get saved version code
var prefs: SharedPreferences = getSharedPreferences(prefs_name, MODE_PRIVATE)
var savedVersionCode: Int = 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();
}
¿Por qué no utilizar el Asistente de base de datos? Esto tendrá un buen onCreate que solo se llama la primera vez que se inicia la aplicación. Esto ayudará a aquellas personas que quieran realizar un seguimiento de esto después de que se haya instalado la aplicación inicial sin seguimiento.
onCreate()se llama para cada nueva versión. Además, ¿no se consideraría superfluo o usar algo para un propósito no deseado?
Me gusta tener un "recuento de actualizaciones" en mis preferencias compartidas. Si no está allí (o el valor cero predeterminado), entonces este es el "primer uso" de mi aplicación.
private static final int UPDATE_COUNT = 1; // Increment this on major change
...
if (sp.getInt("updateCount", 0) == 0) {
// first use
} else if (sp.getInt("updateCount", 0) < UPDATE_COUNT) {
// Pop up dialog telling user about new features
}
...
sp.edit().putInt("updateCount", UPDATE_COUNT);
Así que ahora, cada vez que hay una actualización de la aplicación que los usuarios deben conocer, incremento UPDATE_COUNT
/**
* @author ALGO
*/
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()) {
writeInstallationFile(installation);
}
sID = readInstallationFile(installation);
launchFlag = true;
} 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);
Hola chicos, estoy haciendo algo como esto. Y funciona para mi
cree un campo booleano en preferencia compartida. El valor predeterminado es verdadero {isFirstTime: true} después de la primera vez, configúrelo en falso. Nada puede ser simple y confiable que esto en el sistema Android.
Context.getSharedPreferences()hace, terminará en el mismo lugar, excepto que funcionará en todas partes