Recuento de inicio de aplicación

Estoy trabajando en una aplicación, en la que, por ejemplo, después de 5 veces que un usuario abre la aplicación, en el 6º bash, la aplicación debe solicitar comentarios del usuario. Intenté usar Activity OnStart , OnResume , pero no funciona, ya que incluso después de salir y volver a ingresar en la actividad se llaman a estos métodos. Además, según la funcionalidad de Android, no puedo cerrar la aplicación para poder encontrarla desde la primera actividad llamada. ¿Cómo puedo saber cuántas veces se lanzó la aplicación?

Espero que esto no sea confuso

Editar

Alternativamente, hay una manera, en la que siempre puedo reanudar mi aplicación desde la primera actividad (o página de bienvenida, por ejemplo), una vez que el usuario presiona el inicio para salir de la aplicación.

Esto es realmente bastante simple. Usando SharedPreference o la base de datos.

durante OnCreate agrega 1 al contador number ofTimes y confirma.

 OnCreate (Bundle bundle){ mPref = getPreferences(); int c = mPref.getInt("numRun",0); c++; mPref.edit().putInt("numRun",c).commit(); //do other stuff... } 

Se llama a OnCreate independientemente de que inicie la aplicación o reanude la aplicación, pero isFinishing () devuelve verdadero si y solo si el usuario (o usted) llamó a finish () en la aplicación (y no fue destruido por el administrador)

De esta manera, solo boostá cuando esté comenzando de nuevo.

el método isFinishing () dentro de un método OnPause para verificar si la actividad se está terminando () o simplemente se está pausando.

 @Override protected void OnPause(){ if(!isFinishing()){ c = mPref.getInt("numRun",0); c--; mPref.edit().putInt("numRun",c).commit(); } //Other pause stuff. } 

Esto cubre todos tus escenarios:

 1. user starts app/activity (+1)-> finishes app, exit with finish() 2. user starts app (+1) -> pause (-1) -> returns (+1)-> finish 3. user starts app (+1) -> pause (-1) -> android kills process (0) -> user returns to app (+1) -> user finish. 

cada escenario solo incrementa el contador de “tiempos corridos” una vez por “ejecución” de la actividad

Sólo:

  1. declarar:

     private SharedPreferences prefs; private SharedPreferences.Editor editor; private int totalCount; 
  2. inicializar en onCreate() :

     prefs = getPreferences(Context.MODE_PRIVATE); editor = prefs.edit(); 
  3. imprima o cuente donde desee (en cualquier lugar de onCreate() o en cualquier clic específico como especifique):

      totalCount = prefs.getInt("counter", 0); totalCount++; editor.putInt("counter", totalCount); editor.commit(); 
  4. ahora imprime totalCount donde quieras contar, por ejemplo:

      System.out.println("Total Application counter Reach to :"+totalCount); 

si tiene una actividad inicial para el lanzamiento de la aplicación, puede implementarla de las siguientes maneras 1. Base de datos: a través de la base de datos puede guardar el recuento de inicio de la aplicación y recuperarla en la creación de actividad.

  1. Variable estática: la variable estática también conserva los valores durante el inicio y el final de la aplicación

  2. Preferencia de la aplicación: puede guardar el valor en la preferencia de la aplicación y usarlo

El problema con el enfoque 2 y 3 es que si apaga y enciende su teléfono perderá datos. pero si aún quieres usar el enfoque 2 o 3, entonces el enfoque 2 es muy simple y

código de muestra para el 3er enfoque aquí

Bueno, tienes que extender la clase de aplicación y crear una subclase a partir de ese

 public class MyApp extends Application{ int visitCount; onCreate(){ visitCount=0; } 

y puedes mencionarlo en tu archivo de menifiesto como

  .....  

y enCreación de su actividad puede obtenerla

 MyApp myApp=(MyApp)getApplicationContext(); 

Edit1: subclass su actividad y método de anulación

 public class myActivity extends Activity{ @Override onSaveInstanceState(Bundle outState){ super.onSaveInstanceState(outState); counterFlag=true; } } 

se llama cuando el usuario presiona el botón de inicio

y vuelva a anular onResume () y verifique si su marcador de contador está habilitado o no y cree toda su actividad subclasificando su MyActivity

también si cualquier otra actividad tiene un punto de salida al hacer clic en el botón Atrás, puede anular

  @Override public void back_pressed(){ } 

y haz tu tarea en consecuencia

Creo que esta sería la mejor opción para cubrir todos los escenarios:

 private static boolean valueOfLaunchCountModified = false; @Override protected void onCreate(Bundle savedInstanceState) { if(!valueOfCountModified){ preferences = getPreferences(MODE_PRIVATE); launchCount= preferences.getInt("launchCount", 0); if(preferences.edit().putInt("launchCount", ++launchCount).commit()){ valueOfCountModified = true; if(launchCount == 5){ //Do whatever you want } } } } 

Si recordamos la definición de una variable estática (“… Están asociados con la clase, en lugar de con cualquier objeto. Cada instancia de la clase comparte una variable de clase …”) descubriremos que es perfecto para nosotros.

Cuando se ejecuta el método OnPause o se ejecuta un cambio de orientación, el valor de “valueOfLaunchCountModified” no cambia; sin embargo, si se destruye el proceso de la aplicación, el valor de “valueOfLaunchCountModified” cambia a falso.

Si solo desea contar las invocaciones “verdaderas”, extienda la aplicación y coloque la lógica del contador en Application#onCreate . Esto podría ser una preferencia simple

Prefiero usar onResume para rastrear el recuento de lanzamientos, ya que se llama en todos los escenarios (consulte el Ciclo de vida de la actividad de Android ) cuando se muestra la actividad.

onResume podría ser llamado con bastante frecuencia dependiendo del patrón de uso, por lo que en lugar de rastrear el conteo de lanzamientos, sería mejor rastrear la sesión de lanzamiento (ya que en solo 1 recuento de lanzamientos sería rastreado por hora).

 @Synchronized fun appSessionCount(sharedPref: SharedPreferences): Boolean { val now = LocalDateTime.now(ZoneOffset.UTC) val firstSeconds = sharedPref.getLong(KEY_FIRST_LAUNCH_DATE, 0) if (firstSeconds == 0L) { sharedPref.edit { putLong(KEY_FIRST_LAUNCH_DATE, now.atZone(ZoneOffset.UTC).toEpochSecond()) } } val seconds = sharedPref.getLong(KEY_LAST_SESSION_DATE, 0) val lastDate = if (seconds > 0) LocalDateTime.ofInstant(Instant.ofEpochSecond(seconds), ZoneOffset.UTC) else null var count = sharedPref.getLong(KEY_SESSION_COUNT, 0) // first time or 1 hour ago if (lastDate == null || Duration.between(lastDate, now).toHours() >= 1) { sharedPref.edit { putLong(KEY_SESSION_COUNT, count + 1) putLong(KEY_LAST_SESSION_DATE, now.atZone(ZoneOffset.UTC).toEpochSecond()) } return true } return false } 

onResume el código en onResume de mi actividad principal.

 class MainActivity : AppCompatActivity() { lateinit var sharedPref: SharedPreferences override fun onCreate(savedInstanceState: Bundle?) { sharedPref = getSharedPreferences("LuaApp", Context.MODE_PRIVATE) } override fun onResume() { super.onResume() appSessionCount(sharedPref) } } 

https://code.luasoftware.com/tutorials/android/android-track-app-launch-count/