public class MyApplication extends Application {
// take the date and convert it to a timestamp. this is just an example.
private static final long MIN_FIRST_INSTALL_TIME = 1413267061000L;
// shared preferences key
private static final String PREF_SHARE_REQUIRED = "pref_share_required";
@Override
public void onCreate() {
super.onCreate();
checkAndSaveInstallInfo();
}
private void checkAndSaveInstallInfo() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
if (prefs.contains(PREF_SHARE_REQUIRED)) {
// already have this info, so do nothing
return;
}
PackageInfo info = null;
try {
info = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
// bad times
Log.e("MyApplication", "couldn't get package info!");
}
if (packageInfo == null) {
// can't do anything
return;
}
boolean shareRequired = true;
if (MIN_FIRST_INSTALL_TIME > info.firstInstallTime
&& info.firstInstallTime != info.lastUpdateTime) {
/*
* install occurred before a version with this behavior was released
* and there was an update, so assume it's a legacy user
*/
shareRequired = false;
}
prefs.edit().putBoolean(PREF_SHARE_REQUIRED, shareRequired).apply();
}
}
9条答案
按热度按时间nbysray51#
我的解决方案是使用SharedPreference
返回3个posibles值:
njthzxwz2#
更新
因为你真的不能追溯改变你的应用程序以前版本的代码,我认为最简单的是允许所有***当前***安装的祖父。
因此,要跟踪这一点,一种方法是找到指向应用特定版本的信息。无论是带时间戳的文件还是
SharedPreferences
,甚至是versionCode
(正如@DaudArfin在回答中所建议的)从上一个版本的应用程序开始,你想让用户没有这个限制。那么你需要改变这一点。然后,该更改将成为所有先前安装的参考点。对于这些用户,请将其"has_shared"
标记标记标记为true。他们将在中成为"grandfathered"。然后,您可以将"has_shared"
默认设置设置为true
(原件,部分答复见下文)
使用共享首选项(或类似选项)
使用类似
SharedPreferences
的值,这样你就可以输入一个类似has_shared = true
的简单值,SharedPreferences
将在应用更新过程中持续存在。当用户注册/共享您的应用程序时会出现类似情况
那么只有当pref返回true时,您才能窃听用户
http://developer.android.com/training/basics/data-storage/shared-preferences.html
yquaqz183#
您可以使用下面的代码片段获得版本代码和版本名称
现在您可以检查最新版本并根据您的要求进行限制。
a2mppw5e4#
我们可以使用广播接收器来收听应用程序更新。
接收器
清单
调试时不起作用,所以你必须手动安装。
1.增加应用级build.gradle中的versionCode(以便将其视为更新)。
1.点击构建-〉构建捆绑包/ APK-〉构建APK,然后选择调试APK。
1.在Android Studio的终端中运行以下命令:
e3bfsja25#
如果您希望每次更新只执行一次任何操作,请按照以下代码片段
}
tgabmvqs6#
vfwfrxfs7#
我认为唯一不涉及设备外部实体的解决方案是获取应用的
PackageInfo
并检查versionCode
firstInstallTime
lastUpdateTime
在第一次安装时,
firstInstallTime
和lastUpdateTime
将具有相同的值(至少在我的设备上它们是相同的);在更新之后,值将不同,因为lastUpdateTime
将改变。2另外,您知道创建引入此新行为的版本的大致日期和时间,并且您还知道它将具有哪个版本代码。我将扩展
Application
,在onCreate()
中实现这个检查,并将结果存储在SharedPreferences
中:这并不是万无一失的,如果用户真的想这么做,有很多方法可以绕过这个问题,但我认为这是最好的办法了。如果你想更好地跟踪这些信息,避免用户篡改,你应该开始在服务器上存储用户信息(假设你有任何后端)。
jhdbpxl98#
检查旧版本的应用是否在磁盘或偏好设置中保存了一些数据。这些数据必须是安全的,即用户无法删除(我不确定是否可能)。
新版本刚安装时,此数据将不存在。如果新版本是旧版本的升级版本,则此数据将存在。
最坏的情况是,旧用户将被标记为新用户,并限制其使用。
mv1qrgav9#
一个简洁的Kotlin解答,基于考夫林的出色回答:
这可以直接从
Activity
中调用,因为“活动”是一个上下文(因此可以访问packageManager
等)。如果你想在多个地方/上下文中使用它,可以很容易地将它转换成一个扩展属性:
这样,您就可以在任何“活动”中写入
if (isFreshInstall)
,或者在任何“片段”中写入if (requireContext().isFreshInstall)
。