Получить время, в которое приложение было закрыто.Как? - PullRequest
0 голосов
/ 24 сентября 2019

Я хочу создать idlegame, и для этого мне нужно получить время, в которое приложение было закрыто, чтобы я мог рассчитать доход за это время в автономном режиме.

Моей первой идеей было получить currentTimeMillis и сохранить их через sharedPreferences, и при повторном открытии приложения я вычисляю разницу между текущим и сохраненным временем.Моя проблема в том, что переменная sharedPreferences, кажется, все время равна 0.

мой код:

Zeit = System.currentTimeMillis() / 1000L;
Zeit_Differenz = Zeit - Zeit_SAVE;

        Log.i("e","aktuelle Zeit: " + Zeit);
        Log.i("e", "gespeicherte Zeit: " + Zeit_SAVE);
        Log.i("e", "errechnete differenz: " + Zeit_Differenz);
SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putLong("Zeit save", Zeit);
editor.apply();
SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
Zeit_SAVE = sharedPreferences.getLong("Zeit save", 0);

Logcat:

aktuelle Zeit: 1569344292                         (time right now)
gespeicherte Zeit: 0                              (saved time)
errechnete differenz: 1569344292                  (calculated difference)

Тамэто другой код между этими фрагментами.Я только что скопировал самый важный код для вас.

Надеюсь, вы мне поможете, это единственная моя идея, как этого добиться.

Ответы [ 3 ]

1 голос
/ 25 сентября 2019

tl; dr

Я не могу помочь с сохранением значений в хранилище, так как я не использую Android.Но я могу показать, как записать текущий момент, а затем вычислить прошедшее время.

Записать текущий момент.

Instant.now().toString()

"2019-09-24T20:50:52.827365Z"

Parseэта строка и захватывает прошедшее время:

Duration                                              // Represent a span-of-time not attached to the timeline.
.between(                                             // Calculate time elapsed between a pair of moments.
    Instant.parse( "2019-09-24T20:50:52.827365Z" ) ,  // Parse string in standard ISO 8601 format. The `Z` on the end means UTC, pronounced “Zulu”. 
    Instant.now()                                     // Capture the current moment in UTC.
)                                                     // Returns a `Duration` object. 
.toMillis()                                           // Interrogates the `Duration` object for its total elapsed time in milliseconds, effectively truncating any microseconds/nanoseconds.

java.time

Современный подход к отслеживанию времени использует классы java.time , а именно:

  • Instant для представления момента в UTC
  • Duration для представления промежутка времени, не привязанного к временной шкале, в основномколичество наносекунд.

Захват текущего момента в формате UTC.

Instant instant = Instant.now() ;

Сохранение текстового представления этого значения в стандартном формате ISO 8601 .

String output = instant.toString() ;

Считайте эту сохраненную строку и проанализируйте как Instant.

String input = "2019-09-24T20:50:52.827365Z" ;
Instant then = Instant.parse( input ) ;

Захватить текущий момент и рассчитать прошедшее время как `Длительность.

Instant now = Instant.now() ;
Duration d = Duration.of( then , now ) ;

Если вы хотите, чтобы прошедшее время представляло собой общее количество миллисекунд, запросите Duration объект.

long milliseconds = d.toMillis() ;  // Total elapsed time in milliseconds, truncating any microseconds/nanoseconds. 

О java.time

java.time *Платформа 1063 * встроена в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java.time классы.

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесены в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии пакетов Android для реализации java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .
1 голос
/ 25 сентября 2019

Просто переопределите методы Activity.onPause() и Activity.onResume(), чтобы сохранить метку времени, а затем выполнить вычисление.Этот пробел в имени предпочтения Zeit save может заставить его всегда возвращать значение по умолчанию 0;лучше заменить это подчеркиванием _, например.timestamp_paused.

0 голосов
/ 24 сентября 2019

Попробуйте эту статью https://www.javatpoint.com/java-get-current-date

Получить текущую дату и вычесть из даты при следующей загрузке - сохранить в файл между экземплярами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...