Android 清除应用程序';以编程方式保存数据

Android 清除应用程序';以编程方式保存数据,android,Android,我希望以编程方式清除应用程序的数据 应用程序的数据可能包含数据库、共享首选项、内部外部文件或应用程序内创建的任何其他文件 我知道我们可以通过以下方式清除移动设备中的数据: 设置->应用程序->管理应用程序->我的应用程序->清除 资料 但是我需要通过一个Android程序来做上面的事情吗?我只是把这里的教程放在这篇文章中 package com.hrupin.cleaner; import java.io.File; import android.app.Application; impor

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

应用程序的数据可能包含数据库、共享首选项、内部外部文件或应用程序内创建的任何其他文件

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

设置->应用程序->管理应用程序->我的应用程序->清除 资料


但是我需要通过一个Android程序来做上面的事情吗?

我只是把这里的教程放在这篇文章中

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;
    }
}
更新:


如果没有这样做,您需要将android:name=“your.package.MyApplication”添加到AndroidManifest.xml中的
应用程序标记中。否则,
MyApplication.getInstance()
将返回
null
,如果您希望减少冗长的黑客攻击,则会产生NullPointerException

void deleteDirectory(String path) {
  Runtime.getRuntime().exec(String.format("rm -rf %s", path));
}

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

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

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.
}

最简单的方法是

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

我在任何地方使用的内容:

 Runtime.getRuntime().exec("pm clear me.myapp");
执行上述代码将关闭应用程序并删除所有数据库和共享首选项


结合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();
    } 
}
private void clearAppData(){
试一试{
//清除应用程序数据
如果(Build.VERSION\u CODES.KITKAT尝试此代码

private void clearAppData() {
    try {
        if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
            ((ActivityManager)getSystemService(ACTIVITY_SERVICE)).clearApplicationUserData();
        } else {
            Runtime.getRuntime().exec("pm clear " + getApplicationContext().getPackageName());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
private void clearAppData(){
试一试{

如果(Build.VERSION\u CODES.KITKAT)小心!你删除了应用程序文件夹中的所有内容,包括共享首选项。不仅是缓存目录本身及其内容。我已经实现了此解决方案。但是我的应用程序数据没有被清除,只有缓存被清除。还有5 MB的空间。任何其他解决方案?请帮助我:(@MinceMan请注意,这必须在扩展应用程序以获得更好效果的类中写入。非常聪明,以保持lib dir。是的,它删除了所有文件,但应用程序未实现,因此我仍然可以是应用程序dir上的文件。从最近的应用程序中删除应用程序后,应用程序实现清除。请启动它。我尝试重新创建活动,但它不起作用。您可能需要它引用该路径以防它有空格和其他内容。对我来说。clearApplicationUserData();也就是强制关闭应用程序。它必须关闭应用程序,否则可能会有它保留的数据被写回。唯一安全的方法是(1)关闭应用程序,(2)清除其所有数据,(3)下一次应用程序启动时,它将在没有数据的情况下重新启动。Hi@TWiStErRob我想在单击应用程序中的注销按钮时实现此方法。但它会强制关闭应用程序。相反,我想在存在注册/登录表单的地方启动主活动。这将如何实现?对于KitKat之前的版本,请参阅以下答案:是否可能在应用此代码后,您可以启动任何其他活动。我不建议使用此方法。使用可能不存在的命令行程序(例如,
pm
)是有风险的。它们不属于Android SDK“合同”的一部分,因此,它们是否存在于给定设备上,或者是否与其他设备上的行为相同,取决于制造商和自定义ROM开发人员。作为替代方案,我还有一个选项,即((ActivityManager)context.getSystemService(ACTIVITY_SERVICE)).clearApplicationUserData();但它有一个限制,即它只能在API级别>=19的情况下工作。请在此提供一个替代选项,或者可能是另一个选项。无论Android版本如何,它都能在所有Android设备上工作吗?对我来说,它能在我拥有的所有3台Android设备上工作(含棒棒糖、棉花糖和馅饼)是的,if-else是用于等于或小于kit-kat的…使用clearApplicationUserData,在上面它使用runtime.EXE…基本上是一个shell命令…除了权限之外非常可靠…它应该可以正常工作。。。
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();
    } 
}
private void clearAppData() {
    try {
        if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
            ((ActivityManager)getSystemService(ACTIVITY_SERVICE)).clearApplicationUserData();
        } else {
            Runtime.getRuntime().exec("pm clear " + getApplicationContext().getPackageName());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}