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

uda*_*day 114 android

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

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

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

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

但我需要通过Android程序做上述事情吗?

Min*_*Man 100

我只是在这篇文章中发布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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

prefs.edit().clear().commit();
Run Code Online (Sandbox Code Playgroud)

更新:

如果你还没有这样做,你需要添加android:name="your.package.MyApplication"application tagAndroidManifest.xml里面.否则,MyApplication.getInstance()返回null,导致NullPointerException.

  • 照顾自己 !您删除app文件夹中的所有内容,包括共享首选项..不仅是缓存目录本身及其内容. (5认同)
  • 我已经实现了这个解决方案 但是我的应用程序数据没有被清除只有缓存被清除.. 5 MB仍然存在..任何其他解决方案?请帮帮我:( (2认同)

TWi*_*Rob 98

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

如果你不想要hacky方式,你也可以隐藏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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 对我来说.clearApplicationUserData(); 是强制关闭应用程序. (9认同)
  • 它必须杀死应用程序,否则它可能拥有它将被写回的数据.唯一安全的方法是(1)杀死应用程序,(2)清除所有数据,(3)下次启动应用程序时,它将在没有数据的情况下重新启动. (8认同)
  • 嗨@TWiStErRob我想在我的应用程序中单击LOGOUT按钮时实现此方法.但它强制关闭应用程序.相反,我想开始注册/签到表格的主要活动..这怎么可能? (4认同)
  • 应用此代码后是否可以启动其他任何活动 (2认同)

Sum*_*ain 11

最简单的方法是

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

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

  • 我不推荐这种方法。使用可能不存在的命令行程序(例如“ pm”)是有风险的。它们不是Android SDK“合同”的一部分,因此,它们是否存在于给定设备上或它们的行为是否与其他设备上的行为相同,取决​​于制造商和定制ROM开发人员。 (3认同)
  • 作为替代,我还有一个选项,即((ActivityManager)context.getSystemService(ACTIVITY_SERVICE)).clearApplicationUserData(); 但它有一个限制,它只能工作API级别> = 19你能在这里提供替代或可能是另一种选择. (2认同)

Cra*_*lWS 10

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