Clear Application's Data Programmatically

Android

Android Problem Overview


I want to clear my application's data programmatically.

Application's data may contain anything like databases, shared preferences, Internal-External files or any other files created within the application.

I know we can clear data in the mobile device through:

> Settings->Applications-> ManageApplications-> My_application->Clear > Data

But I need to do the above thing through an Android Program?

Android Solutions


Solution 1 - Android

There's a new API introduced in API 19 (KitKat): ActivityManager.clearApplicationUserData().

I highly recommend using it in new applications:

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

If you don't want the hacky way you can also hide the button on the UI, so that functionality is just not available on old phones.

Knowledge of this method is mandatory for anyone using android:manageSpaceActivity.


Whenever I use this, I do so from a manageSpaceActivity which has android:process=":manager". There, I manually kill any other processes of my app. This allows me to let a UI stay running and let the user decide where to go next.

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

Solution 2 - Android

I'm just putting the tutorial from the link ihrupin posted here in this post.

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

So if you want a button to do this you need to call MyApplication.getInstance(). clearApplicationData() from within an onClickListener

Update: Your SharedPreferences instance might hold onto your data and recreate the preferences file after you delete it. So your going to want to get your SharedPreferences object and

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

Update:

You need to add android:name="your.package.MyApplication" to the application tag inside AndroidManifest.xml if you had not done so. Else, MyApplication.getInstance() returns null, resulting a NullPointerException.

Solution 3 - Android

combine code from 2 answers:

Here is the resulting combined source based answer

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();
    } 
}

Solution 4 - Android

The Simplest way to do this is

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();
} }

This will clear the data and remove your app from memory. It is equivalent to clear data option under Settings --> Application Manager --> Your App --> Clear data

Solution 5 - Android

What I use everywhere :

 Runtime.getRuntime().exec("pm clear me.myapp");

> Executing above piece of code closes application and removes all databases and shared preferences

Solution 6 - Android

If you want a less verbose hack:

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

Solution 7 - Android

Try this code

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();
    }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionudayView Question on Stackoverflow
Solution 1 - AndroidTWiStErRobView Answer on Stackoverflow
Solution 2 - AndroidMinceManView Answer on Stackoverflow
Solution 3 - AndroidCrandellWSView Answer on Stackoverflow
Solution 4 - AndroidSummved JainView Answer on Stackoverflow
Solution 5 - Androiduser6796473View Answer on Stackoverflow
Solution 6 - AndroidChristopher PerryView Answer on Stackoverflow
Solution 7 - AndroidFakhriddin AbdullaevView Answer on Stackoverflow