更新时清除应用程序数据

Jos*_*hua 4 versioning version-control android android-version

我需要清除(相当于清除数据应用程序设置)在应用中的所有旧的数据编程,当用户更新从谷歌Play应用程式商店或任何其他来源。这是因为与旧应用程序相比,我已经更改了新应用程序中的所有内容,因此我不需要旧应用程序中的任何现有数据。

我曾考虑过在应用启动时实施版本检查,但找不到找到应用先前版本 versionCode或的方法versionName。我发现清除数据的唯一方法是lastUpdateTime在发布应用程序时检查。但这并不可靠,因为用户还有其他获取应用程序的方式或来源(例如与朋友共享该应用程序或用户拥有旧应用程序的备份)。

有什么建议么?

Nir*_*tel 6

你可以存储versionCodeSharedPreferences与当前比较versionCode

为了清除所有数据,您只需要清除SharedPreferences,Local Database和所有已存储的本地文件的所有值。

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

注意:不要删除共享首选项中的last_version值。


Dri*_*ori 5

您只需使用一个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>
Run Code Online (Sandbox Code Playgroud)

并添加您的接收器类。onReceive当应用程序更新时将被调用:

public class UpdateReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context con, Intent intent) {
        
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:您不需要过滤包。使用MY_PACKAGE_REPLACED它只会为您的应用程序触发。