Xóa dữ liệu của ứng dụng có lập trình


121

Tôi muốn xóa dữ liệu ứng dụng của mình theo lập trình.

Dữ liệu của ứng dụng có thể chứa bất kỳ thứ gì như cơ sở dữ liệu, tùy chọn được chia sẻ, tệp Bên trong-Bên ngoài hoặc bất kỳ tệp nào khác được tạo trong ứng dụng.

Tôi biết chúng tôi có thể xóa dữ liệu trong thiết bị di động thông qua:

Cài đặt-> Ứng dụng-> Quản lý ứng dụng-> Ứng dụng của tôi-> Xóa dữ liệu

Nhưng tôi cần thực hiện điều trên thông qua Chương trình Android?

Câu trả lời:


111

Có một API mới được giới thiệu trong API 19 (KitKat): ActivityManager.clearApplicationUserData () .

Tôi thực sự khuyên bạn nên sử dụng nó trong các ứng dụng mới:

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

Nếu bạn không muốn theo cách hacky, bạn cũng có thể ẩn nút trên giao diện người dùng để chức năng đó không có sẵn trên điện thoại cũ.

Kiến thức về phương pháp này là bắt buộc đối với bất kỳ ai sử dụng android:manageSpaceActivity.


Bất cứ khi nào tôi sử dụng cái này, tôi làm như vậy từ manageSpaceActivitycái có android:process=":manager". Ở đó, tôi tự hủy bất kỳ quy trình nào khác trong ứng dụng của mình. Điều này cho phép tôi để giao diện người dùng tiếp tục chạy và cho phép người dùng quyết định nơi tiếp theo.

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
cho tôi .clearApplicationUserData (); buộc đóng ứng dụng.
gaurav414u

9
Nó phải giết ứng dụng, nếu không nó có thể có dữ liệu mà nó đang lưu giữ sẽ được ghi lại. Cách an toàn duy nhất để làm điều này là (1) hủy ứng dụng, (2) xóa tất cả dữ liệu của ứng dụng, (3) lần sau khi khởi động ứng dụng, ứng dụng sẽ bắt đầu mới mà không có dữ liệu.
hackbod

4
Xin chào @TWiStErRob Tôi muốn triển khai phương pháp này khi nhấp vào nút LOGOUT trong ứng dụng của mình. Nhưng nó buộc phải đóng ứng dụng. Thay vào đó, tôi muốn bắt đầu hoạt động chính khi có biểu mẫu đăng ký / đăng nhập .. Làm cách nào để có thể thực hiện được?
pblead 26

1
Đối với phiên bản KitKat trước, hãy xem câu trả lời sau: stackoverflow.com/a/23470355/3256989
ultraon.

2
là nó có thể bắt đầu bất kỳ hoạt động nào khác sau khi áp dụng mã này
Amandeep Rohila

106

Tôi chỉ đưa hướng dẫn từ liên kết mà ihrupin đã đăng ở đây trong bài đăng này.

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

Vì vậy, nếu bạn muốn một nút để thực hiện điều này, bạn cần gọi MyApplication.getInstance (). clearApplicationData () từ bên trong onClickListener

Cập nhật: Phiên bản của bạn SharedPreferencescó thể giữ dữ liệu của bạn và tạo lại tệp tùy chọn sau khi bạn xóa nó. Vì vậy, bạn sẽ muốn lấy SharedPreferencesđối tượng của mình và

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

Cập nhật:

Bạn cần thêm android:name="your.package.MyApplication"vào application tagbên trong AndroidManifest.xml nếu bạn chưa làm như vậy. Khác, MyApplication.getInstance()trả về null, dẫn đến một NullPointerException .


5
Bảo trọng ! Bạn xóa mọi thứ trong thư mục ứng dụng, bao gồm cả các tùy chọn chia sẻ .. không chỉ bản thân bộ nhớ cache và nội dung của nó.
Snicolas

2
Tôi đã thực hiện giải pháp này. Nhưng dữ liệu ứng dụng của tôi không bị xóa chỉ có bộ nhớ cache bị xóa .. 5 MB vẫn còn lại .. giải pháp nào khác ?? Xin hãy giúp tôi :(
SweetWisher ツ

1
@MinceMan hãy đề cập đến điều này phải được writted trong lớp đó mở rộng ứng dụng cho hiệu quả tốt hơn
creepy_driver

Rất thông minh để giữ dir lib.
frostymarvelous

1
vâng, nó đã xóa tất cả các tệp nhưng ứng dụng không nhận ra điều đó nên tôi vẫn có thể là tệp trên dir ứng dụng. Ứng dụng nhận ra việc xóa sau khi xóa ứng dụng khỏi ứng dụng gần đây bằng cách khởi động nó. Tôi đã cố gắng tạo lại hoạt động nhưng nó không hoạt động
gturedi

15

kết hợp mã từ 2 câu trả lời:

Đây là kết quả trả lời dựa trên nguồn kết hợp

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

Điều này sẽ hoạt động trên tất cả các thiết bị Android không phân biệt phiên bản Android? Đối với tôi, nó hoạt động trên tất cả 3 thiết bị Android tôi sở hữu (với Lollipop, Marshmallow và Pie)
Kathir

yea if else là bằng hoặc nhỏ hơn kit kat ... sử dụng clearApplicationUserData và cao hơn nó sử dụng runtime.exce ... về cơ bản là một lệnh shell ... khá đáng tin cậy ngoài quyền ... nó sẽ hoạt động ...
CrandellWS

13

Cách đơn giản nhất để làm điều này là

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

Thao tác này sẽ xóa dữ liệu và xóa ứng dụng của bạn khỏi bộ nhớ. Nó tương đương với tùy chọn xóa dữ liệu trong Cài đặt -> Trình quản lý ứng dụng -> Ứng dụng của bạn -> Xóa dữ liệu


3
Tôi không khuyến nghị cách tiếp cận này. Sử dụng các chương trình dòng lệnh (ví dụ pm:) có thể không tồn tại là rủi ro. Chúng không phải là một phần của "hợp đồng" SDK Android, và do đó, liệu chúng có tồn tại trên một thiết bị nhất định hay chúng hoạt động giống như chúng trên các thiết bị khác là tùy thuộc vào nhà sản xuất và nhà phát triển ROM tùy chỉnh.
CommonsWare 14/02/17

2
Để thay thế, tôi có một tùy chọn nữa tức là ((ActivityManager) context.getSystemService (ACTIVITY_SERVICE)) .clearApplicationUserData (); Nhưng nó có một hạn chế là nó chỉ hoạt động ở cấp API> = 19 Bạn có thể vui lòng cung cấp một phương án thay thế tại đây hoặc có thể là một tùy chọn khác.
Jain được triệu tập vào


-1

Nếu bạn muốn một bản hack ít dài dòng hơn:

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

1
Bạn có thể muốn trích dẫn đường dẫn đó trong trường hợp nó có khoảng trống và nhiều thứ.
TWiStErRob
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.