ล้างข้อมูลของแอปพลิเคชันโดยทางโปรแกรม


121

ฉันต้องการล้างข้อมูลแอปพลิเคชันของฉันโดยใช้โปรแกรม

ข้อมูลของแอปพลิเคชันอาจมีอะไรก็ได้เช่นฐานข้อมูลค่ากำหนดที่ใช้ร่วมกันไฟล์ภายใน - ภายนอกหรือไฟล์อื่น ๆ ที่สร้างขึ้นภายในแอปพลิเคชัน

ฉันรู้ว่าเราสามารถล้างข้อมูลในอุปกรณ์มือถือผ่าน:

การตั้งค่า -> แอปพลิเคชัน -> จัดการแอปพลิเคชัน -> My_application-> ล้างข้อมูล

แต่ฉันต้องทำสิ่งข้างต้นผ่านโปรแกรม Android?

คำตอบ:


111

มี API ใหม่แนะนำใน API 19 เป็น (KitKat): 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.
}

หากคุณไม่ต้องการวิธีแฮ็กคุณสามารถซ่อนปุ่มบน 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);
        }
    }
}

9
สำหรับฉัน .clearApplicationUserData (); กำลังบังคับปิดแอปด้วย
gaurav414u

9
มันต้องฆ่าแอพมิฉะนั้นอาจมีข้อมูลที่ยึดไว้ซึ่งจะถูกเขียนกลับมา วิธีเดียวที่ปลอดภัยในการทำเช่นนี้คือ (1) ฆ่าแอป (2) ล้างข้อมูลทั้งหมด (3) ครั้งต่อไปที่แอปเริ่มต้นแอปจะเริ่มต้นใหม่โดยไม่มีข้อมูล
hackbod

4
สวัสดี @TWiStErRob ฉันต้องการใช้วิธีนี้เมื่อคลิกที่ปุ่ม LOGOUT ในแอปพลิเคชันของฉัน แต่มันบังคับให้ปิดแอป แต่ฉันต้องการเริ่มกิจกรรมหลักที่มีแบบฟอร์มการสมัคร / ลงชื่อเข้าใช้ .. จะเป็นไปได้อย่างไร
pblead26

1
สำหรับรุ่นก่อน KitKat โปรดดูคำตอบนี้: stackoverflow.com/a/23470355/3256989
ultraon

2
เป็นไปได้หรือไม่ที่จะเริ่มกิจกรรมอื่น ๆ หลังจากใช้รหัสนี้
Amandeep Rohila

107

ฉันแค่ใส่บทช่วยสอนจากลิงค์ที่ 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;
    }
}

ดังนั้นหากคุณต้องการให้ปุ่มทำสิ่งนี้คุณต้องเรียก MyApplication.getInstance () clearApplicationData () จากภายใน onClickListener

อัปเดต:SharedPreferencesอินสแตนซ์ ของคุณอาจยึดข้อมูลของคุณและสร้างไฟล์การกำหนดลักษณะใหม่หลังจากที่คุณลบ ดังนั้นคุณจะต้องการรับSharedPreferencesวัตถุของคุณและ

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

ปรับปรุง:

คุณต้องเพิ่มandroid:name="your.package.MyApplication"ไปapplication tagภายใน AndroidManifest.xml ถ้าคุณไม่ได้ทำเพื่อ อื่นMyApplication.getInstance()ผลตอบแทนnullผลNullPointerException


5
ดูแล ! คุณลบทุกสิ่งในโฟลเดอร์แอพรวมถึงการตั้งค่าการแชร์ .. ไม่เพียง แต่ตัวแคชและเนื้อหาเท่านั้น
Snicolas

2
ฉันได้ใช้วิธีนี้แล้ว แต่ข้อมูลแอปพลิเคชันของฉันไม่ได้ล้างแคชเท่านั้นที่ถูกล้าง .. 5 MB ยังเหลืออยู่ .. วิธีอื่น ๆ ?? โปรดช่วยฉันด้วย :(
SweetWisher ツ

1
@MinceMan โปรดระบุว่าสิ่งนี้จะต้องถูกเขียนในชั้นเรียนที่ขยายแอปพลิเคชันเพื่อให้ได้ผลที่ดีขึ้น
creepy_driver

ฉลาดมากที่จะรักษา lib dir
หนาวจัด

1
ใช่มันลบไฟล์ทั้งหมด แต่แอพไม่รู้ดังนั้นฉันยังคงเป็นไฟล์ในแอพ dir แอปรับรู้การล้างหลังจากลบแอพออกจากแอพล่าสุดเริ่มต้น ฉันพยายามสร้างกิจกรรมขึ้นใหม่ แต่ไม่ได้ผล
gturedi

15

รวมรหัสจาก 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();
    } 
}

สิ่งนี้จะใช้ได้กับอุปกรณ์ Android ทั้งหมดโดยไม่คำนึงถึงเวอร์ชัน Android หรือไม่ สำหรับฉันมันใช้งานได้กับอุปกรณ์ Android ทั้ง 3 เครื่องที่ฉันเป็นเจ้าของ (กับ Lollipop, Marshmallow และ Pie)
Kathir

ใช่ if else มีค่าเท่ากับหรือน้อยกว่า kit kat ... ใช้ clearApplicationUserData และสูงกว่านั้นใช้ runtime.exce ... โดยทั่วไปคำสั่งเชลล์ ... ค่อนข้างน่าเชื่อถือนอกเหนือจากสิทธิ์ ... มันควรจะใช้งานได้ ...
CrandellWS

13

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือ

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

การดำเนินการนี้จะล้างข้อมูลและลบแอปของคุณออกจากหน่วยความจำ เทียบเท่ากับตัวเลือกการล้างข้อมูลภายใต้การตั้งค่า -> ตัวจัดการแอปพลิเคชัน -> แอปของคุณ -> ล้างข้อมูล


3
ฉันไม่อยากแนะนำวิธีนี้ การใช้โปรแกรมบรรทัดคำสั่ง (เช่นpm) ที่อาจไม่มีอยู่นั้นมีความเสี่ยง พวกเขาไม่ได้เป็นส่วนหนึ่งของ "สัญญา" ของ Android SDK ดังนั้นไม่ว่าจะมีอยู่ในอุปกรณ์ที่กำหนดหรือไม่ว่าจะทำงานเหมือนกับที่ทำบนอุปกรณ์อื่น ๆ ก็ขึ้นอยู่กับผู้ผลิตและผู้พัฒนา ROM ที่กำหนดเอง
CommonsWare

2
ทางเลือกอื่นฉันมีอีกหนึ่งตัวเลือกคือ ((ActivityManager) context.getSystemService (ACTIVITY_SERVICE)) .clearApplicationUserData (); แต่มีข้อ จำกัด ว่าใช้ได้เฉพาะระดับ API> = 19 คุณช่วยระบุทางเลือกที่นี่ได้ไหมหรืออาจเป็นตัวเลือกอื่น
สรุปเชน


-1

หากคุณต้องการแฮ็คที่ละเอียดน้อยลง:

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

1
คุณอาจต้องการอ้างอิงเส้นทางนั้นในกรณีที่มีช่องว่างและสิ่งของต่างๆ
TWiStErRob
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.