23

Android アプリケーションを開発していますが、システムの初回起動時間を決定する際に問題が発生しました。つまり、デバイスの最初の起動からすでに経過した時間を測定する必要があります。

ACTION_BOOT_COMPLETED をリッスンし、SharedPreferences に何かを保存するソリューションについては知っていますが、別のソリューションが必要な場合があります。たぶん、システムプロパティはありますか?

ユースケース(議論からの抜粋)

  1. サーバーから受信した各ファイルのファイル名には、サーバーから取得したタイムスタンプが含まれていますSystem.currentMillis()
  2. これらのタイムスタンプを比較して、最新のファイルを特定します。
  3. 現在、ユーザーはシステム時刻を数か月先に変更しています。
  4. ユーザーがシステム時刻を変更した後にダウンロードされた最新のファイルを特定できます。
  5. ここで、ユーザーは時間を元の設定に戻します。
  6. タイムスタンプを比較すると、ステップ 4 でダウンロードしたファイルが常に優先されます。

この問題を解決する特効薬は、最初の起動 (出荷時設定へのリセット後) からの秒数をカウントするタイムスタンプです。と同じですSystemClock.elapsedRealtime()が、各起動後のリセットはありません。残念ながら、これまでの回答から、この特効薬は存在しないことがわかります。

ただし、多くの回答は、その問題に取り組む方法の多種多様なオプションを示しています。OneWorld123 は、それぞれの回答について、それが彼のニーズにどのように合っているかについてコメントしました。

4

5 に答える 5

13

たぶん、システムプロパティはありますか?

システム プロパティについては不明ですが、SystemClockシステムの稼働時間を取得するための API を提供するクラスがあります。

SystemClock.uptimeMillis()どれの

ディープスリープで費やされた時間をカウントせずに、起動からのミリ秒を返します。

SystemClock.elapsedRealtime()which を使用することもできます

sleep で費やされた時間を含む、起動からのミリ秒を返します。

お役に立てれば。

于 2014-04-25T01:30:47.420 に答える
9

Android デバイスが初めて起動されたのはいつかを知る必要がある場合は、

最も簡単な方法は、アプリケーションを用意することです

  • 工場出荷時のイメージにインストールされている
  • 起動時に実行するように構成されている
  • sharedPreference最初の実行時に現在の日付と時刻をに記録します

その後、Android デバイスの最初の起動時間を決定する必要がある他のアプリsharedPreferenceは、デバイスの存続期間中に適切な時間を検索できます。(または、デバイスが工場出荷時設定にリセットされるまで。この時点で、プリインストールされたアプリは、再起動後に新しい日付と時刻を共有設定に書き込みます。)


ただし、Android デバイスにアプリケーションをプレインストールできない場合は、いくつかの回避策が考えられます。

1. root/スーパーユーザーとして

最初の起動時に Android デバイスで作成されることが知られているディレクトリ/ファイルのタイムスタンプを検索します。

2.通常のアプリとして、

標準の Android API を使用した簡単な回避策は、最初の起動時にインストールされることが知られている適切なシステム パッケージのインストール時間を確認することです。

/* 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.通常のアプリとして、

特定のパッケージが初回起動時に 1 回更新される (そして二度と更新されない) と信頼できる場合は、次のようにその更新時間を確認できます。

/* 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();
于 2016-01-30T13:59:30.483 に答える
1

これらの ANDROID SDK には 3 つの方法があります。

public static long  elapsedRealtime ()

API レベル 1 で追加

スリープ状態で費やされた時間を含む、起動からのミリ秒を返します。戻り値

起動からの経過ミリ秒。

public static long elapsedRealtimeNanos ()

API レベル 17 で追加

スリープ状態で費やされた時間を含む、起動からのナノ秒を返します。戻り値

ブートから経過したナノ秒。

@oneWorld の場合:

2つのアプローチを使用できます:-

1)書き込み中に、一部のデータの日付が現在の日付よりも古いかどうかを確認し、前のデータの日付を現在の日付と時刻よりも小さい日付に変更して、正しい最新のデータを返すようにします。

2) サーバーに時刻を保存し、そこから時刻を取得して設定することができます。

于 2016-02-02T05:18:14.577 に答える
1

https://chat.stackoverflow.com/rooms/102325/discussion-between-ankitagrawal-and-oneworldに関するあなたの議論によると、データセットを一意に識別するには単調カウンターが必要です。

そのために、SharedPreference を簡単に設定し、新しい識別子が必要になるたびにこの値を増やすことができます。どれが最新のファイルかを知る必要がある場合は、識別子を比較してください。アプリがアンインストールされるとこのカウンターがリセットされることが問題である場合は、以下を参照してください。

使用できる別のアプローチは、外部サーバーからタイムスタンプを要求することです。

それが役に立てば幸い ;-)

于 2016-02-03T00:16:17.167 に答える