ユーザーがアプリのインストール後、何日経ったらイベントを発生させるとか、レビューを書いてもらうとかする場合に使うはず。
以下3つの時刻が取得できますが、それぞれどう違うのか確認しました。
ApplicationInfo appInfo = getPackageManager().getApplicationInfo(getPackageName(), 0);
long lastInstallTime = new File(appInfo.sourceDir).lastModified();
Log.d("INSTALL_TIME".TAG, "install time = " + Long.toString(lastInstallTime)); //1.
PackageInfo pkgInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_META_DATA);
Log.d("INSTALL_TIME", "firstInstallTime = " + Long.toString(pkgInfo.firstInstallTime)); //2.
Log.d("INSTALL_TIME", "firstInstallTime = " + Long.toString(pkgInfo.lastUpdateTime)); //3.
3つの日時を以下のタイミングで表示した場合をそれぞれ記します。
- 初回インストール時
- すべて同じ日時(びみょうに違うけどほぼ同じ)
1. 1495501926000 Tue May 23 2017 10:12:06
2. 1495501927902 Tue May 23 2017 10:12:07
3. 1495501927902 Tue May 23 2017 10:12:07
- バージョンアップ時
- ApplicationInfoの方はバージョンアップ時の時刻になる
- PackageInfo.firstInstallTimeは インストール時の時刻を保持し続ける
- PackageInfo.lastUpdateTimeは バージョンアップ時の時刻になる
1. 1495502405000 Tue May 23 2017 10:20:05
2. 1495501927902 Tue May 23 2017 10:12:07
3. 1495502406739 Tue May 23 2017 10:20:06
- アンインストール後、再度インストール時
- すべて 再インストール時の時刻 になる
- 最初にインストールした時刻は保持しない
1. 1495502935000 Tue May 23 2017 10:28:55
2. 1495502936618 Tue May 23 2017 10:28:56
3. 1495502936618 Tue May 23 2017 10:28:56
- 再度インストール後、バージョンアップ時
- 初回インストール後にバージョンアップ時と同じ
1. 1495503728000 Tue May 23 2017 10:42:08
2. 1495502936618 Tue May 23 2017 10:28:56
3. 1495503730004 Tue May 23 2017 10:42:10
まとめ
- ApplicationInfo.sourceDir.lastModified() アップデート毎に変わる
- pkgInfo.firstInstallTime アップデートしても インストール時の時間を保持し続ける
- pkgInfo.lastUpdateTime アップデート毎に変わる
2.(firstInstallTime)はfirstとついているからアンインストール後の再度インストール時に一回目にインストールした日時が保持され続けるのかと思ったが 直近のインストール日時が保持されるっぽい。
※ PackageInfoのインスタンス取得(getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_META_DATA))はほぼ1msくらいで返ってきたので、問題なく使えるのかと思います。
初回インストール時に日時をプリファレンスに記載するのもありだが、プリファレンスが増えるのもあまり好ましくないので速く取得できるならこの方法でいいのかなと思います。