Tempo dal primo avvio

Sto sviluppando un'applicazione android e colpito il problema con la determinazione del primo tempo di avvio del sistema. Voglio dire che ho bisogno di misurare quanto tempo passato già dal primo avvio del dispositivo .

So di soluzioni con ascolto per ACTION_BOOT_COMPLETED e salvo qualsiasi cosa in SharedPreferences, ma ho bisogno di un'altra soluzione, perché questo non funziona per alcuni casi. Forse c'è una properties; del sistema?

  • Imansible risolvere il simbolo 'supporto' (utilizzando Android Studio, seguendo la guida iniziale)
  • Invia una richiesta JSONArray POST con la libreria di androidi volley
  • Qual è il modo migliore per implementare pulsanti di selezione a scelta singola in una list di androidi che utilizza una scheda di arrays personalizzata?
  • Esplora file di Android Device Monitor non funziona con l'emulatore che esegue API 24+
  • Autenticazione di Facebook senza button di accesso
  • Modifica dell'image delle risorse della barra di avanzamento
  • Caso di utilizzo (estratto dalla discussione )

    1. Il nome file di each file che riceve dal server include un timestamp prelevato da System.currentMillis()
    2. Confronto questi timestamp per determinare quale file è quello più attuale.
    3. Ora, l'utente cambia il tempo di sistema pochi mesi prima.
    4. Sono ancora in grado di determinare il file più corrente scaricato dopo che l'utente ha modificato il tempo di sistema.
    5. Ora, l'utente cambia tempo indietro all'impostazione originale.
    6. Il file scaricato sul passaggio 4 vince sempre quando si confronta i timestamp.

    Il proiettile d'argento per risolvere questo problema sarebbe un timestamp che conta i secondi dal primo avvio (dopo il ripristino della fabbrica). Proprio come SystemClock.elapsedRealtime() ma senza reset dopo each avvio. Purtroppo, le risposte finora ci dicono, che questo proiettile d'argento non esiste.

    Tuttavia, molte risposte mostrano una grande varietà di opzioni per affrontare questo problema. OneWorld123 ha commentato each risposta, come si adattava alle sue esigenze.

  • "Imansible risolvere la risorsa" nell'anteprima di Android Studio
  • Può qualcuno dirmi, come personalizzare il nome del dispositivo Bluetooth locale?
  • L'impulso incorporato della macchina fotografica dell'emulatore in Froyo / 2.2?
  • android preference categoria colore di background
  • Carriage restituisce / interruzioni di linea con stringhe \ n in Android
  • aprire un'attività da un CordovaPlugin
  • 5 Solutions collect form web for “Tempo dal primo avvio”

    Forse c'è una properties; del sistema?

    Non è sicuro della properties; di sistema, ma c'è la class SystemClock che fornisce API per get l'impiego del sistema:

    SystemClock.uptimeMillis() che

    Restituisce millisecondi dal caricamento, senza contare il tempo trascorso in un sonno profondo .

    È anche ansible utilizzare SystemClock.elapsedRealtime() che

    Restituisce millisecondi dall'avvio, incluso il tempo trascorso nel sonno .

    Spero che questo ti aiuti.

    Nel caso in cui si deve sapere quando è stata la prima volta che un dispositivo Android è stato avviato ,

    Il metodo più semplice sarebbe avere un'applicazione

    • che viene installato nell'image di fabbrica
    • che è configurato per eseguire durante l'avvio
    • che registra la data e l'ora correnti in una sharedPreference alla sua prima esecuzione

    Successivamente tutte le altre applicazioni che necessitano di determinare la prima volta di avvio del dispositivo Android possono sharedPreference la sharedPreference appropriata durante la durata del dispositivo. (o fino a quando il dispositivo non viene ripristinato in fabbrica, a quel punto l'applicazione preinstallata scriverà la nuova data e ora nella preferenza condivisa dopo un riavvio.)


    Tuttavia, se non è ansible preinstallare un'applicazione sul dispositivo Android, un paio di soluzioni alternative potenziali potrebbero essere:

    1. Come root / superuser

    si dovrebbe cercare il timbro temporale di una directory / file che è noto per essere creato sul dispositivo Android durante il primo avvio.

    2. Come applicazione normale,

    un semplice metodo di soluzione alternativa che utilizza le API standard di Android sarebbe quello di verificare l'installazione di un pacchetto di sistema appropriato che è noto per essere installato durante il primo avvio.

     /* 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. In alternativa come app normale,

    se possiamo contare su un pacchetto specifico che viene aggiornato una sola volta durante il primo avvio (e mai più), possiamo controllare il suo tempo di aggiornamento come segue:

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

    Esistono 3 methods in ANDROID SDK per questi: –

     public static long elapsedRealtime () 

    Aggiunto nel livello API 1

    Restituisce millisecondi dall'avvio, incluso il tempo trascorso nel sonno. Restituisce

    passato millisecondi dall'avvio.

     public static long elapsedRealtimeNanos () 

    Aggiunto nel livello API 17

    Restituisce nanosecondi dall'avvio, incluso il tempo trascorso nel sonno. Restituisce

    nanosecondi trascorsi dall'avvio.

    Per il caso @oneWorld: u può utilizzare 2 approcci: –

    1) durante la scrittura controllare se alcuni dati hanno una data superiore alla data corrente, quindi modificare la data dei dati precedenti a qualcosa di less che i dati e l'ora correnti, in modo da restituirà i dati più recenti corretti

    2) u può memorizzare il tempo sul server e recuperare il tempo da lì e impostarlo

    Se rispettiamo l'SDK, non so di un metodo che fornisce queste informazioni direttamente; ma potrebbe essere un modo per trarre queste informazioni da altre risorse. Ancora una volta, se siamo conformi a SDK, un'opzione "piuttosto affidabile" è quella di utilizzare le statistiche sull'utilizzo delle applicazioni che Android OS salva durante la durata del dispositivo. Cioè – il timestamp per una prima "statistiche di utilizzo" mai salvata.

    Questo, però, chiaramente non fornisce un timestamp "primo tempo di avvio" preciso, quindi dipende dal fatto che una certa approssimazione sia nel tuo caso. In generale, il problema con le statistiche di utilizzo è che Andriod lo aggrega per periodi distanti nel tempo – quindi, il dispositivo più vecchio è – less precisa è la data. Ad esempio, per il mio attuale telefono, innanzitutto il 3 dicembre 2014, le statistiche aggregate sull'utilizzo sono registrate per la prima volta il 21 dicembre 2014 attualmente (per il record – è il febbraio 2016 al momento della scrittura). (Devo ammettere però che non so come il sistema operativo Android pianifica l'aggregazione e se è appena prevista il 21 dicembre each anno, o se è davvero un po 'vicino al primo utilizzo del dispositivo – credo sia facile per controllare con qualsiasi altro dispositivo.)

    Di seguito è riportto un codice di esempio che mostra l' utilizzo di UsageStatsManager , ma certamente avrebbe bisogno di ulteriori aggiustamenti per affrontare il fatto di avere più precisione per periodi più recenti:

     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 

    Notare inoltre che, come documentato nell'SDK, UsageStatsManager richiede l'authorization a livello di sistema PACKAGE_USAGE_STATS , quindi è necessario che l'utente accetti l'impostazione in Impostazioni:

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

    Spero che sia d'aiuto!

    Secondo la tua discussione su: http://chat.stackoverflow.com/rooms/102325/discussion-between-ankitagrawal-and-oneworld , è necessario un contatore monotono per identificare in modo univoco un set di dati.

    Per questo è ansible impostare facilmente una SharedPreference e incrementare questo valore each volta che hai bisogno di un nuovo identificatore. Quando hai bisogno di sapere quale è il file più recente, basta confrontare gli identificatori. Se si tratta di un problema che il contatore viene ripristinato una volta disinstallata l'applicazione, fare riferimento a: In android c'è un modo per preservare SharedPreferences dopo una disinstallazione

    Un approccio diverso che potrebbe essere utilizzato è quello di richiedere un timestamp da un server esterno.

    Spero che sia d'aiuto 😉

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.