【问题标题】:Clear android cache during the upgrade to new version在升级到新版本期间清除android缓存
【发布时间】:2015-04-16 12:32:46
【问题描述】:

在升级到新版本或安装过程中,有没有办法以编程方式清除 Android 应用程序的缓存?

【问题讨论】:

  • 什么样的缓存?
  • 特别是网络缓存..我正在我的应用程序中运行一个网络视图
  • webView.clearDisk(true);如果您还想清除磁盘上的文件
  • 第一次安装或升级时可以只做一次吗?我不想每次应用程序运行时都这样做。问题是当我升级时,我有我以前版本的应用程序的 html 残余。当我从应用程序信息中手动清除缓存时,这些残留物被删除并且一切看起来都很好..我想在升级期间以编程方式执行此操作。有可能吗?
  • 第一次安装没有意义。关于升级,您可以在 sharedpreference 上添加一个版本号,并在每次应用启动时检查此号码

标签: android


【解决方案1】:

android 在 ActivityManager 类中有clearApplicationUserData()。 此方法与设置中明确点击清除应用数据的效果相同。

这是参考——

http://developer.android.com/reference/android/app/ActivityManager.html#clearApplicationUserData()

希望这会有所帮助 干杯!

【讨论】:

【解决方案2】:

在清单中使用“PACKAGE_REPLACED”操作写入接收器。

    @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) {
                // write logic to delete cache directory 
                // Get cache dir as context.getCacheDir()
            }
        }

【讨论】:

    【解决方案3】:

    回到this answer,您可以通过以下方式清除应用程序的缓存:

    public static void deleteCache(Context context) {
        try {
            File dir = context.getCacheDir();
            if (dir != null && dir.isDirectory()) {
                deleteDir(dir);
            }
        } catch (Exception e) {}
    }
    
    private 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();
    }
    

    每次更新您的应用时只需调用 deleteCache()。 要检查您的应用是否已更新,您只需将版本字符串保存到 SharedPreference 中,然后将保存的值与实际值进行比较。

    public static boolean isNewVersion(Context context) {
        String newVersion = "", oldVersion = "";
    
        PackageManager manager = context.getPackageManager();
        PackageInfo info = null;
        try {
            info = manager.getPackageInfo(context.getPackageName(), 0);
            newVersion = info.versionName;
        } catch (PackageManager.NameNotFoundException e) {
            // TODO what to do?
        }
        oldVersion = getVersionString();
    
        // returns whether the new version string differs (is also false for first install)
        return !(oldVersion.equals(DEFVAL_STRING) || oldVersion.equals(newVersion));
    }
    
    public static String getVersionString(Context context) {
         SharedPreferences preferences =    context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);        
         return preferences.getString(KEY_VERSION, DEFVAL_STRING);
    }
    

    【讨论】:

      【解决方案4】:

      如果您只想将其用于 webview,您可以将缓存清除添加到 webview 加载的 url。将应用版本添加到查询字符串中,用户升级后您将获得全新下载:

      "http://www.stackoverflow.com?v=" + BuildConfig.VERSION_NAME
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-02
        • 2016-08-29
        • 1970-01-01
        • 1970-01-01
        • 2018-04-18
        • 1970-01-01
        • 2011-05-27
        相关资源
        最近更新 更多