以编程方式清除应用程序的数据


120

我想以编程方式清除应用程序的数据。

应用程序的数据可能包含数据库,共享首选项,内部-外部文件或在应用程序内创建的任何其他文件之类的内容。

我知道我们可以通过以下方式清除移动设备中的数据:

设置->应用程序->管理应用程序->我的应用程序->清除数据

但是我需要通过Android程序来完成上述操作吗?

Answers:


110

API 19(KitKat)中引入了一个新的API: ActivityManager.clearApplicationUserData()

我强烈建议在新应用程序中使用它:

import android.os.Build.*;
if (VERSION_CODES.KITKAT <= VERSION.SDK_INT) {
    ((ActivityManager)context.getSystemService(ACTIVITY_SERVICE))
            .clearApplicationUserData(); // note: it has a return value!
} else {
    // use old hacky way, which can be removed
    // once minSdkVersion goes above 19 in a few years.
}

如果您不希望采用这种骇人听闻的方式,则还可以在UI上隐藏按钮,以便该功能仅在旧手机上不可用。

使用的任何人都必须了解此方法android:manageSpaceActivity


每当我使用它时,我都会从具有的manageSpaceActivity这样做android:process=":manager"。在那里,我手动终止了我应用程序的所有其他进程。这使我可以让UI保持运行状态,并让用户决定下一步要去哪里。

private static void killProcessesAround(Activity activity) throws NameNotFoundException {
    ActivityManager am = (ActivityManager)activity.getSystemService(Context.ACTIVITY_SERVICE);
    String myProcessPrefix = activity.getApplicationInfo().processName;
    String myProcessName = activity.getPackageManager().getActivityInfo(activity.getComponentName(), 0).processName;
    for (ActivityManager.RunningAppProcessInfo proc : am.getRunningAppProcesses()) {
        if (proc.processName.startsWith(myProcessPrefix) && !proc.processName.equals(myProcessName)) {
            android.os.Process.killProcess(proc.pid);
        }
    }
}

9
对我来说.clearApplicationUserData(); 也强制关闭该应用程序。
gaurav414u 2015年

9
它必须终止该应用程序,否则它可能持有的数据将被写回。唯一安全的方法是(1)终止该应用程序;(2)清除其所有数据;(3)下次启动该应用程序时,它将重新开始,没有任何数据。
hackbod 2015年

4
@TWiStErRob,您好:我想在应用程序中单击“注销”按钮时实现此方法。但是它会强制关闭应用程序。相反,我想开始存在注册/登录表单的主要活动。这怎么可能?
pblead26 '16

1
对于KitKat之前的版本,请参见以下答案:stackoverflow.com/a/23470355/3256989
ultraon

2
应用此代码后是否可以开始其他活动
Amandeep Rohila 17-02-22

106

我只是将这篇文章中链接ihrupin的教程放到这里。

package com.hrupin.cleaner;

import java.io.File;

import android.app.Application;
import android.util.Log;

public class MyApplication extends Application {

    private static MyApplication instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public static MyApplication getInstance() {
        return instance;
    }

    public void clearApplicationData() {
        File cacheDirectory = getCacheDir();
        File applicationDirectory = new File(cacheDirectory.getParent());
        if (applicationDirectory.exists()) {
            String[] fileNames = applicationDirectory.list();
            for (String fileName : fileNames) {
                if (!fileName.equals("lib")) {
                    deleteFile(new File(applicationDirectory, fileName));
                }
            }
        }
    }

    public static boolean deleteFile(File file) {
        boolean deletedAll = true;
        if (file != null) {
            if (file.isDirectory()) {
                String[] children = file.list();
                for (int i = 0; i < children.length; i++) {
                    deletedAll = deleteFile(new File(file, children[i])) && deletedAll;
                }
            } else {
                deletedAll = file.delete();
            }
        }

        return deletedAll;
    }
}

因此,如果您想要一个按钮来执行此操作,则需要调用MyApplication.getInstance()。从onClickListener内部的clearApplicationData()

更新: 您的SharedPreferences实例可能会保留您的数据,并在删除后重新创建首选项文件。所以你想得到你的SharedPreferences对象

prefs.edit().clear().commit();

更新:

如果尚未添加android:name="your.package.MyApplication",则需要添加到application tag内部AndroidManifest.xml中。否则,MyApplication.getInstance()返回null,导致NullPointerException


5
照顾自己 !您删除了app文件夹中的所有内容,包括共享首选项。不仅是缓存目录本身及其内容。
尼克斯

2
我已经实现了这个解决方案。但是我的应用程序数据没有被清除,仅缓存被清除了。仍然剩余5 MB。请帮帮我:(
SweetWisher

1
@MinceMan请注意,必须在扩展Application的类中编写此脚本才能获得更好的效果
令人毛骨悚然的驱动

保留lib目录非常聪明。
frostymarvelous

1
是的,它删除了所有文件,但应用程序未意识到这一点,因此我仍然可以是应用程序目录中的文件。从最近启动的应用中删除应用后,应用实现了清除。我尝试重新创建活动,但无法正常工作
gturedi 2015年

15

结合2个答案中的代码:

这是基于组合源的结果答案

private void clearAppData() {
    try {
        // clearing app data
        if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
            ((ActivityManager)getSystemService(ACTIVITY_SERVICE)).clearApplicationUserData(); // note: it has a return value!
        } else {
            String packageName = getApplicationContext().getPackageName();
            Runtime runtime = Runtime.getRuntime();
            runtime.exec("pm clear "+packageName);
        }

    } catch (Exception e) {
        e.printStackTrace();
    } 
}

不论Android版本如何,这都能在所有Android设备上运行吗?对我来说,它可以在我拥有的所有3个Android设备上使用(与Lollipop,棉花糖和Pie一起使用)
Kathir

是的,如果if等于或小于kit kat ...使用clearApplicationUserData并在其上面使用runtime.exce ...基本上是一个shell命令...除权限外还相当可靠...它应该可以工作...
CrandellWS

12

最简单的方法是

private void deleteAppData() {
     try {
    // clearing app data
    String packageName = getApplicationContext().getPackageName();
    Runtime runtime = Runtime.getRuntime();
    runtime.exec("pm clear "+packageName);

} catch (Exception e) {
    e.printStackTrace();
} }

这将清除数据并从内存中删除您的应用程序。等效于设置->应用程序管理器->您的应用程序->清除数据下的清除数据选项


3
我不推荐这种方法。使用pm可能不存在的命令行程序(例如)是有风险的。它们不是Android SDK“合同”的一部分,因此,它们是否存在于给定的设备中,或者它们的行为是否与其他设备相同,取决​​于制造商和定制ROM开发人员。
CommonsWare

2
作为替代,我还有一个选择,即((ActivityManager)context.getSystemService(ACTIVITY_SERVICE)).clearApplicationUserData(); 但是它有一个局限性,那就是仅适用于> = 19的API级别。您可以在这里提供一个替代方法还是其他选择。
Summved Jain


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.