studio programacion para móviles libro edición desarrollo curso con aplicaciones java android time clock system-clock

java - para - manual de programacion android pdf



Tiempo desde el primer arranque (5)

Tal vez hay alguna propiedad del sistema?

No estoy seguro de las propiedades del sistema, pero hay SystemClock clase SystemClock que proporciona API para obtener el tiempo de actividad del sistema:

SystemClock.uptimeMillis() que

Devuelve milisegundos desde el inicio, sin contar el tiempo que se pasa en modo de suspensión profunda .

También puede usar SystemClock.elapsedRealtime() que

Devuelve milisegundos desde el inicio, incluido el tiempo transcurrido en reposo .

Espero que esto ayude.

Estoy desarrollando una aplicación para Android y soluciono el problema con la determinación del tiempo de inicio del sistema. Quiero decir que necesito medir cuánto tiempo pasó desde que el dispositivo arrancó por primera vez .

Sé acerca de la solución con la escucha de ACTION_BOOT_COMPLETED y guardo cualquier cosa en SharedPreferences, pero necesito otra solución, porque esta no funciona en algunos casos. Tal vez hay alguna propiedad del sistema?

Caso de uso (extracto de la discussion )

  1. El nombre del archivo de cada archivo que recibo del servidor incluye una marca de tiempo tomada de System.currentMillis()
  2. Comparo esas marcas de tiempo para determinar qué archivo es el más actual.
  3. Ahora, el usuario cambia el tiempo del sistema unos meses antes.
  4. Todavía puedo determinar el archivo más reciente descargado después de que el usuario cambió la hora del sistema.
  5. Ahora, el usuario cambia el tiempo a la configuración original.
  6. El archivo descargado en el paso 4 siempre gana al comparar las marcas de tiempo.

La bala de plata para resolver este problema sería una marca de tiempo que cuenta segundos desde el primer arranque (después del restablecimiento de fábrica). Al igual que SystemClock.elapsedRealtime() pero sin restablecer después de cada arranque. Desafortunadamente, las respuestas hasta ahora nos dicen que esta bala de plata no existe.

Sin embargo, muchas respuestas muestran una gran variedad de opciones para abordar ese problema. OneWorld123 comentó cada respuesta, cómo se adaptaba a sus necesidades.


De acuerdo con su discusión en: discussion , necesita un contador monotónico para identificar de manera única un conjunto de datos.

Para eso puede establecer fácilmente una SharedPreference e incrementar este valor cada vez que necesite un nuevo identificador. Cuando necesite saber cuál es el archivo más nuevo, simplemente compare los identificadores. Si se trata de un problema que este contador se restablece una vez que se desinstala la aplicación, consulte: en Android hay alguna forma de preservar SharedPreferences después de una desinstalación.

Un enfoque diferente que podría utilizarse es solicitar una marca de tiempo de un servidor externo.

Espero eso ayude ;-)


En caso de que uno necesite saber cuándo fue la primera vez que se inició un dispositivo Android ,

El método más fácil sería tener una aplicación

  • que está instalado en la imagen de fábrica
  • que está configurado para ejecutarse durante el arranque
  • que registra la fecha y hora actual en una sharedPreference en su primera ejecución

Posteriormente, cualquier otra aplicación que necesite determinar el primer tiempo de arranque del dispositivo Android puede buscar la sharedPreference adecuada durante la vida útil del dispositivo. (o hasta que el dispositivo se restablezca de fábrica; en ese punto, la aplicación preinstalada escribiría la nueva fecha y hora en la preferencia compartida después de reiniciar).

Sin embargo, si no es posible preinstalar una aplicación en el dispositivo Android, entonces un par de soluciones posibles serían:

1. Como root / superusuario

uno buscaría la marca de tiempo de un directorio / archivo que se sabe que se creó en el dispositivo Android durante el primer arranque.

2. Como una aplicación regular,

Un método de solución simple que utiliza API estándar de Android sería verificar el tiempo de instalación de un paquete de sistema apropiado que se sabe que se instala durante el primer arranque.

/* This returns the last time a package was installed */ PackageManager pm = context.getPackageManager(); PackageInfo pInfo = pm.getPackageInfo(<app-package-name>, 0); return pInfo.firstInstallTime;

3. Alternativamente como una aplicación regular,

si podemos confiar en que un paquete específico se actualice una sola vez durante el primer arranque (y nunca más) podemos verificar su tiempo de actualización de la siguiente manera:

/* This returns the last time a package was updated */ PackageManager pm = context.getPackageManager(); ApplicationInfo appInfo = pm.getApplicationInfo(<app-package-name>, 0); String appFile = appInfo.sourceDir; long installed = new File(appFile).lastModified();


Hay 3 métodos en el SDK de ANDROID para estos:

public static long elapsedRealtime ()

Agregado en el nivel de API 1

Devuelve milisegundos desde el inicio, incluido el tiempo transcurrido en reposo. Devoluciones

milisegundos transcurridos desde el arranque.

public static long elapsedRealtimeNanos ()

Agregado en el nivel de API 17

Devuelve nanosegundos desde el inicio, incluido el tiempo transcurrido en modo inactivo. Devoluciones

nanosegundos transcurridos desde el arranque.

Para el caso @oneWorld:

Puedes usar el enfoque 2:

1) Al escribir, compruebe si algunos datos tienen una fecha superior a la actual, luego cambie la fecha de los datos anteriores a algo menos que los datos actuales y la hora, de modo que devolverá los últimos datos correctos.

2) Puede almacenar la hora en el servidor y recuperar el tiempo desde allí y configurarlo.


Si nos atenemos al SDK, no conozco ningún método que proporcione esta información directamente; pero puede haber una forma de derivar esta información de otros recursos. Nuevamente, si nos apegamos al SDK, una opción "bastante confiable" es usar las estadísticas de uso de la aplicación que el sistema operativo Android guarda durante la vida útil del dispositivo. Es decir, la marca de tiempo de las primeras "estadísticas de uso" guardadas.

Esto, sin embargo, claramente no proporciona una marca de tiempo exacta de "primer arranque", por lo que depende de si una aproximación es correcta en su caso. En general, el problema con las estadísticas de uso es que Andriod lo agrega por períodos lejanos en el tiempo, por lo tanto, cuanto más viejo es el dispositivo, menos precisa es la fecha. Por ejemplo, para mi teléfono actual, que se inició por primera vez el 3 de diciembre de 2014, las estadísticas de uso agregadas se registran por primera vez el 21 de diciembre de 2014 (para el registro, es febrero de 2016 en el momento de escribir esto). (Debo admitir sin embargo que no sé cómo el sistema operativo Android planifica la agregación, y si solo está programado para el 21 de diciembre de cada año, o si de hecho está algo cerca del primer uso del dispositivo, supongo que es fácil para consultar con cualquier otro dispositivo).

Lo que sigue es un código de muestra que muestra el uso de UsageStatsManager , pero ciertamente necesitaría más ajustes para abordar el hecho de tener más precisión para períodos más recientes:

UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE); Calendar year2013 = Calendar.getInstance(); year2013.set(2013, 0, 1); List<UsageStats> stats = usageStatsManager.queryUsageStats( UsageStatsManager.INTERVAL_YEARLY, // or adjust for "younger" devices to get more precision - so, you''ll probably need several queries year2013.getTimeMillis(), Calendar.getInstance().getTimeInMillis()); // now, first element in stats (if it is present at all) will point to the "earliest" statistics saved *for this interval* (yearly in this case) // use UsageStats.getFirstTimeStamp() to get first known/saved usage

Tenga en cuenta también que, tal como se documenta en el SDK, UsageStatsManager requiere el permiso de nivel de sistema PACKAGE_USAGE_STATS , por lo que deberá hacer que el usuario lo acepte primero en Configuración:

Intent settingsIntent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); startActivity(settingsIntent);

¡Espero eso ayude!