当用户从 Google Play 商店或任何其他来源更新应用程序时,我需要以编程方式清除(相当于应用程序设置中的清除数据)应用程序中的所有旧数据。这是因为我不需要旧应用程序中的任何现有数据,因为与旧应用程序相比,我已经更改了新应用程序中的所有内容。
我想过在应用程序启动时实现版本检查,但我找不到方法来获取应用程序的 previous
versionCode
或 versionName
。我发现清除数据的唯一方法是在发布应用程序时检查 lastUpdateTime
。但它并不可靠,因为用户有其他方式或来源来获取应用程序(例如与朋友共享,或者用户是否有旧应用程序的备份)。
有什么建议吗?
您可以将
versionCode
存储在 SharedPreferences
中并与当前 versionCode
进行比较
要清除所有数据,您只需清除 SharedPreferences、本地数据库和您存储的所有本地文件的所有值。
public void clearData()
{
try {
PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
int mCurrentVersion = pInfo.versionCode;
SharedPreferences mSharedPreferences = getSharedPreferences("app_name", Context.MODE_PRIVATE);
SharedPreferences.Editor mEditor = mSharedPreferences.edit();
mEditor.apply();
int last_version = mSharedPreferences.getInt("last_version", -1);
if(last_version != mCurrentVersion)
{
//clear all your data like database, share preference, local file
//Note : Don't delete last_version value in share preference
}
mEditor.putInt("last_version", mCurrentVersion);
mEditor.commit();
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
注意:请勿删除共享首选项中的last_version值。
您可以简单地使用
PACKAGE_REPLACED
接收器,每当手机中的软件包被更换时(更新应用程序时也会发生),该接收器就会被触发。在您的清单中声明它:
<receiver android:name=".UpdateReceiver">
<intent-filter>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
<data android:scheme="package" android:path="com.my.app"/>
</intent-filter>
</receiver>
并添加您的接收器类别。
onReceive
当应用程序更新时会被调用:
public class UpdateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context con, Intent intent) {
}
}
编辑:您不需要过滤包。使用
MY_PACKAGE_REPLACED
来代替,它将仅针对您的应用程序触发。
您可以按照以下意图收听系统广播,并在 onReceive 中使用您的包名称进行过滤,以查看您的应用是否已更新。
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<data android:scheme="package" />
</intent-filter>