【问题标题】:Clearing App Data on update更新时清除应用数据
【发布时间】:2018-07-09 06:11:08
【问题描述】:

当用户更新来自 Google Play 商店或任何其他来源的应用。这是因为我不需要旧应用程序中的任何现有数据,因为与旧应用程序相比,我已经更改了新应用程序中的所有内容。

我想在应用启动时实施版本检查,但我找不到获取应用的以前的versionCodeversionName 的方法。我想出清除数据的唯一方法是在发布应用程序时检查lastUpdateTime。但这并不可靠,因为用户有其他获取应用的方式或来源(例如与朋友分享或用户是否有旧应用的备份)。

有什么建议吗?

【问题讨论】:

  • 您找到解决方案了吗?我想实现同样的目标。
  • @kash 我没有尝试以下任何建议,因为我正在从事其他工作。但我相信以下至少一种解决方案会起作用

标签: android version-control versioning android-version


【解决方案1】:

您可以将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 值。

【讨论】:

  • 只有当我将版本保存在旧应用程序的共享首选项中时,您的答案才有效。不幸的是,我没有将版本保存在任何存储中。
  • @Joshua 仍然可以,如果值为 null,那么您可以清除所有数据。
  • @DrilonBlakqori 只需要改变这个条件。
  • 是的,我搞砸了,if(mSharedPreferences.getInt("last_version", -1) != mCurrentVersion) 应该这样做
  • @Joshua 检查我的更新答案,它也适用于旧应用
【解决方案2】:

您可以简单地使用PACKAGE_REPLACED 接收器,只要在您的手机中更换一个包(更新应用程序时也会发生),该接收器就会被触发。在您的清单中声明它:

<receiver android:name=".UpdateReciever">
    <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 UpdateReciever extends BroadcastReceiver {

    @Override
    public void onReceive(Context con, Intent intent) {

    }
}

编辑:您不需要过滤包。请改用MY_PACKAGE_REPLACED,它只会为您的应用触发。

【讨论】:

  • 安装更新后接收器会立即注册吗?因为我假设它会在用户打开应用程序至少一次时注册(因为以前的应用程序没有这个接收器)。
  • 嗨 Drilon,应该在哪里添加接收器类? MainActivity.java ?
【解决方案3】:

您可以使用以下意图收听系统广播,并使用您的包名称过滤 onReceive 以查看您的应用是否已更新。

<intent-filter>
   <action android:name="android.intent.action.PACKAGE_REPLACED" />
   <data android:scheme="package" />
</intent-filter>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多