要求用户在更新时卸载以前的 Android 应用版本
Require users to uninstall previous Android app version on update
我的客户有一个在 Google Play 上发布的应用程序,我们正在发布更新。应用程序发生了很大变化,由于以前的开发人员没有维护代码,我们被迫进行全新安装以使应用程序正常运行(无需花费无数时间跟踪更改和编写迁移脚本)。
有没有办法强制用户在更新时卸载-重新安装(或自动卸载-重新安装)应用程序?
如果您想从您的应用程序中删除所有用户数据,您可以使用以下代码。
public static void clearApplicationData() {
File cache = getInstance().getCacheDir();
File appDir = new File(cache.getParent());
if (appDir.exists()) {
String[] children = appDir.list();
for (String s : children) {
deleteDir(new File(appDir, s));
}
}
}
public static boolean deleteDir(File dir) {
if (dir != null && dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
}
return dir.delete();
}
其中 getInstance()
是您的 Application
class 实例
希望对您有所帮助。
据我所知,没有办法完全按照您的要求进行操作。但是,如果只有数据库更改,您可以只重命名数据库文件,使您的应用程序开始使用新的数据库文件并忽略旧的。
示例:
// in your DatabaseHelper constructor
private DatabaseHelper(Context context) {
super(context, "new_database.db", null, DB_VERSION);
}
听起来您几乎只想删除存储的数据。除了删除包数据目录中的所有文件外,您还可以只清除不想再拥有的数据。
if (shouldClearData()) {
for (String name: databaseList())
deleteDatabase(name);
for (String name: PREFERENCE_FILES)
getSharedPreferences(name, MODE_PRIVATE).edit().clear().apply();
}
如果您只想擦除存储在数据库中的所有数据,您可以增加数据库版本号。 Android 将自动擦除之前版本的所有数据。但我真的不建议这样做,因为您将删除与您的应用程序相关的所有用户数据,这可能会导致用户非常生气,他们不会使用您的新应用程序。
是的,如果该应用仅在 Google Play 上,您可以强制用户卸载并重新安装。
只需在 onResume() 方法中测试是否存在任何非易失性存储变量,这些变量将始终存在于旧应用程序中,而不存在于更新后的应用程序(如果是新安装的)中。
如果存在,请设置一个不可取消的对话框,其中包含一个链接到 Play 商店应用页面的按钮,并说明按该按钮,然后是商店页面上的卸载按钮,然后是安装按钮在同一个商店页面上。
这并不是说强制全新安装是个好主意;这只是对发布的问题的回答。
我的客户有一个在 Google Play 上发布的应用程序,我们正在发布更新。应用程序发生了很大变化,由于以前的开发人员没有维护代码,我们被迫进行全新安装以使应用程序正常运行(无需花费无数时间跟踪更改和编写迁移脚本)。
有没有办法强制用户在更新时卸载-重新安装(或自动卸载-重新安装)应用程序?
如果您想从您的应用程序中删除所有用户数据,您可以使用以下代码。
public static void clearApplicationData() {
File cache = getInstance().getCacheDir();
File appDir = new File(cache.getParent());
if (appDir.exists()) {
String[] children = appDir.list();
for (String s : children) {
deleteDir(new File(appDir, s));
}
}
}
public static boolean deleteDir(File dir) {
if (dir != null && dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
}
return dir.delete();
}
其中 getInstance()
是您的 Application
class 实例
希望对您有所帮助。
据我所知,没有办法完全按照您的要求进行操作。但是,如果只有数据库更改,您可以只重命名数据库文件,使您的应用程序开始使用新的数据库文件并忽略旧的。
示例:
// in your DatabaseHelper constructor
private DatabaseHelper(Context context) {
super(context, "new_database.db", null, DB_VERSION);
}
听起来您几乎只想删除存储的数据。除了删除包数据目录中的所有文件外,您还可以只清除不想再拥有的数据。
if (shouldClearData()) {
for (String name: databaseList())
deleteDatabase(name);
for (String name: PREFERENCE_FILES)
getSharedPreferences(name, MODE_PRIVATE).edit().clear().apply();
}
如果您只想擦除存储在数据库中的所有数据,您可以增加数据库版本号。 Android 将自动擦除之前版本的所有数据。但我真的不建议这样做,因为您将删除与您的应用程序相关的所有用户数据,这可能会导致用户非常生气,他们不会使用您的新应用程序。
是的,如果该应用仅在 Google Play 上,您可以强制用户卸载并重新安装。
只需在 onResume() 方法中测试是否存在任何非易失性存储变量,这些变量将始终存在于旧应用程序中,而不存在于更新后的应用程序(如果是新安装的)中。
如果存在,请设置一个不可取消的对话框,其中包含一个链接到 Play 商店应用页面的按钮,并说明按该按钮,然后是商店页面上的卸载按钮,然后是安装按钮在同一个商店页面上。
这并不是说强制全新安装是个好主意;这只是对发布的问题的回答。