Android 如何以编程方式清除应用程序数据

Android 如何以编程方式清除应用程序数据,android,Android,我正在为android应用程序开发自动化测试(使用Robotium)。为了确保测试的一致性和可靠性,我希望以干净的状态(被测试的应用程序)开始每个测试。为此,我需要清除应用程序数据。这可以在设置/应用程序/管理应用程序/[我的应用程序]/清除数据中手动完成 以编程方式完成此操作的推荐方法是什么?您可以使用此选项清除SharedReferences应用程序数据 Editor editor = context.getSharedPreferences(PREF_FILE_NAME, Context

我正在为android应用程序开发自动化测试(使用Robotium)。为了确保测试的一致性和可靠性,我希望以干净的状态(被测试的应用程序)开始每个测试。为此,我需要清除应用程序数据。这可以在设置/应用程序/管理应用程序/[我的应用程序]/清除数据中手动完成


以编程方式完成此操作的推荐方法是什么?

您可以使用此选项清除SharedReferences应用程序数据

Editor editor = 
context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE).edit();
editor.clear();
editor.commit();
要清除app db,此答案是正确的->

请检查此代码:

@Override
protected void onDestroy() {
// closing Entire Application
    android.os.Process.killProcess(android.os.Process.myPid());
    Editor editor = getSharedPreferences("clear_cache", Context.MODE_PRIVATE).edit();
    editor.clear();
    editor.commit();
    trimCache(this);
    super.onDestroy();
}


public static void trimCache(Context context) {
    try {
        File dir = context.getCacheDir();
        if (dir != null && dir.isDirectory()) {
            deleteDir(dir);

        }
    } catch (Exception e) {
        // TODO: handle exception
    }
}


public 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;
            }
        }
    }

    // <uses-permission
    // android:name="android.permission.CLEAR_APP_CACHE"></uses-permission>
    // The directory is now empty so delete it

    return dir.delete();
}
@覆盖
受保护的空onDestroy(){
//关闭整个应用程序
android.os.Process.killProcess(android.os.Process.myPid());
Editor Editor=getSharedReferences(“清除缓存”,Context.MODE\u PRIVATE.edit();
编辑器.clear();
commit();
trimCache(这个);
super.ondestory();
}
公共静态缓存(上下文){
试一试{
File dir=context.getCacheDir();
if(dir!=null&&dir.isDirectory()){
deleteDir(dir);
}
}捕获(例外e){
//TODO:处理异常
}
}
公共静态布尔deleteDir(文件目录){
if(dir!=null&&dir.isDirectory()){
String[]children=dir.list();
for(int i=0;i
您可以使用软件包管理器工具清除已安装应用程序的数据(类似于按下设备上应用程序设置中的“清除数据”按钮)。 因此,使用adb,您可以:

adb shell pm clear my.wonderful.app.package

如果您只需要清除几个共享首选项,那么


按照@edovino的回答,以编程方式清除应用程序的所有首选项的方法是

private void clearPreferences() {
    try {
        // clearing app data
        Runtime runtime = Runtime.getRuntime();
        runtime.exec("pm clear YOUR_APP_PACKAGE_GOES HERE");

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

警告:应用程序将强制关闭。

从API版本19可以调用ActivityManager.clearApplicationUserData()

使用,我们可以清除特定于应用程序的文件,如首选项、数据库文件。 我使用了下面的代码来使用Espresso进行UI测试

    @Rule
    public ActivityTestRule<HomeActivity> mActivityRule = new ActivityTestRule<>(
            HomeActivity.class);

    public static void clearAppInfo() {
        Activity mActivity = testRule.getActivity();
        SharedPreferences prefs =
                PreferenceManager.getDefaultSharedPreferences(mActivity);
        prefs.edit().clear().commit();
        mActivity.deleteDatabase("app_db_name.db");
    }
@规则
公共活动测试规则mActivityRule=新活动测试规则(
家庭活动(课堂);
公共静态无效clearAppInfo(){
Activity mActivity=testRule.getActivity();
共享引用优先级=
PreferenceManager.GetDefaultSharedReferences(MacActivity);
prefs.edit().clear().commit();
mActivity.deleteDatabase(“app_db_name.db”);
}

如果android版本高于kitkat,您也可以使用它

公共void onClick(视图){

Context Context=getApplicationContext();//添加此行

if(Build.VERSION\u CODES.KITKAT最简单的方法是

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();
    } 
}
这将清除数据并从内存中删除你的应用程序。这相当于“设置-->应用程序管理器-->你的应用程序-->清除数据”下的“清除数据”选项

这将完全删除数据并强制关闭应用程序

以编程方式完成此任务的推荐方法是什么

唯一可能的选择是在测试之前运行ADB命令
ADB shell pm clear package
。最大的问题是,将测试执行和shell命令结合起来有点头疼

然而,我们(Mediafe)提供了一些解决方案,可以在常规无根设备上运行。您只需添加注释即可。其余的都通过运行simple来完成


只需在任何测试之前添加
@ClearData
注释,tada此解决方案确实帮助了我:

通过使用以下两种方法,我们可以通过编程方式清除数据

    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;
}
public void clearApplicationData(){
文件cacheDirectory=getCacheDir();
File applicationDirectory=新文件(cacheDirectory.getParent());
if(applicationDirectory.exists()){
String[]fileNames=applicationDirectory.list();
for(字符串文件名:文件名){
如果(!fileName.equals(“lib”)){
deleteFile(新文件(applicationDirectory,fileName));
}
}
}
}
公共静态布尔删除文件(文件文件){
布尔deletedAll=true;
如果(文件!=null){
if(file.isDirectory()){
String[]children=file.list();
for(int i=0;i
这种由Sebastiano添加的方式是可以的,但当您从IntelliJ IDE运行测试时,有必要添加:

 try {
    // clearing app data
    Runtime runtime = Runtime.getRuntime();
    runtime.exec("adb shell pm clear YOUR_APP_PACKAGE_GOES HERE");

}
而不仅仅是“pm套餐…”


更重要的是:将其添加到driver.setCapability(App_package,package_name)之前。

使用adb工具在应用程序启动之间清除数据是否可行?adb-Wu不幸的是,此选项不可用(adb帮助已过时)。这太好了。在调试数据库问题时,我不得不导航到Clear Data选项,这会破坏我的流程。这里讨论了如何通过Android Studio执行此操作:。具体地说,执行此操作:在Android 2.1-update1上,这不幸会产生
错误:未知命令“Clear”
@Palani:适用于任何版本的above 2.1-r1(andoid-7)。有任何错误消息吗?上面的命令连接到android shell并在android中执行“pm clear my.wonderful.app.package”。在我的设备中,“pm”命令没有“clear”选项。它与sdk无关。它取决于设备固件。我正在查找浏览器的清除数据(defaut)android设备程序中的chrome浏览器应用程序来自我的android应用程序。请提供帮助。并非每台设备都能使用chrome浏览器应用程序,但对于能够使用的设备来说,这是非常棒的
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();
    } 
}
    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;
}
 try {
    // clearing app data
    Runtime runtime = Runtime.getRuntime();
    runtime.exec("adb shell pm clear YOUR_APP_PACKAGE_GOES HERE");

}