Hapus Data Aplikasi Secara Terprogram

121

Saya ingin menghapus data aplikasi saya secara terprogram.

Data aplikasi dapat berisi apa saja seperti database, preferensi bersama, file Internal-Eksternal, atau file lain yang dibuat dalam aplikasi.

Saya tahu kami dapat menghapus data di perangkat seluler melalui:

Pengaturan-> Aplikasi-> Kelola Aplikasi-> Aplikasi_saya-> Hapus Data

Tetapi saya perlu melakukan hal di atas melalui Program Android?

uday
sumber

Jawaban:

111

Ada API baru yang diperkenalkan di API 19 (KitKat): ActivityManager.clearApplicationUserData () .

Saya sangat merekomendasikan menggunakannya di aplikasi baru:

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

Jika Anda tidak ingin cara hacky Anda juga dapat menyembunyikan tombol di UI, sehingga fungsinya tidak tersedia di ponsel lama.

Pengetahuan tentang metode ini wajib bagi siapa saja yang menggunakan android:manageSpaceActivity.


Setiap kali saya menggunakan ini, saya melakukannya dari manageSpaceActivityyang memiliki android:process=":manager". Di sana, saya secara manual mematikan proses lain dari aplikasi saya. Ini memungkinkan saya untuk membiarkan UI tetap berjalan dan membiarkan pengguna memutuskan ke mana harus pergi selanjutnya.

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);
        }
    }
}
TWiStErRob
sumber
9
bagi saya .clearApplicationUserData (); adalah menutup paksa aplikasi juga.
gaurav414u
9
Itu harus mematikan aplikasi, atau itu bisa memiliki data yang dipegangnya yang akan ditulis kembali. Satu-satunya cara yang aman untuk melakukannya adalah dengan (1) mematikan aplikasi, (2) menghapus semua datanya, (3) saat aplikasi dimulai, aplikasi akan mulai segar tanpa data.
hackbod
4
Hai @TWiStErRob Saya ingin menerapkan metode ini ketika mengklik tombol LOGOUT di aplikasi saya. Tapi itu memaksa menutup aplikasi. Sebaliknya, saya ingin memulai aktivitas utama di mana formulir pendaftaran / masuk ada .. Bagaimana ini mungkin?
pblead26
1
Untuk versi KitKat sebelumnya, lihat jawaban ini: stackoverflow.com/a/23470355/3256989
ultraon
2
apakah mungkin untuk memulai aktivitas lain setelah menerapkan kode ini
Amandeep Rohila
106

Saya hanya meletakkan tutorial dari link ihrupin yang diposting di sini di posting ini.

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

Jadi jika Anda ingin tombol untuk melakukan ini, Anda perlu memanggil MyApplication.getInstance (). clearApplicationData () dari dalam onClickListener

Pembaruan:SharedPreferences Instance Anda mungkin menyimpan data Anda dan membuat ulang file preferensi setelah Anda menghapusnya. Jadi, Anda ingin mendapatkan SharedPreferencesobjek Anda dan

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

Memperbarui:

Anda perlu menambahkan android:name="your.package.MyApplication"ke application tagdalam AndroidManifest.xml jika Anda belum melakukannya. Lain, MyApplication.getInstance()kembali null, menghasilkan NullPointerException .

MinceMan
sumber
5
Hati hati ! Anda menghapus semua yang ada di folder aplikasi, termasuk preferensi berbagi .. tidak hanya dir cache itu sendiri dan isinya.
Snicolas
2
Saya telah menerapkan solusi ini. Tetapi data aplikasi saya tidak dihapus hanya cache yang dihapus .. 5 MB masih tersisa .. ada solusi lain ?? Tolong bantu saya :(
SweetWisher ツ
1
@MinceMan Tolong sebutkan bahwa ini harus ditulis di kelas yang memperluas Aplikasi untuk efek yang lebih baik
creepy_driver
Sangat pintar untuk menjaga lib dir.
frostymarvelous
1
ya itu menghapus semua file tetapi aplikasi tidak menyadarinya jadi saya masih bisa menjadi file di direktori aplikasi. Aplikasi menyadari pembersihan setelah menghapus aplikasi dari aplikasi terbaru lalu memulainya. Saya mencoba membuat ulang aktivitas tetapi tidak berhasil
gturedi
15

gabungkan kode dari 2 jawaban:

Berikut adalah gabungan jawaban berbasis sumber

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();
    } 
}
CrandellWS
sumber
Apakah ini akan berfungsi di semua perangkat Android apa pun versi Androidnya? Bagi saya, ini berfungsi di semua 3 perangkat Android yang saya miliki (dengan Lollipop, Marshmallow, dan Pie)
Kathir
ya jika else sama atau kurang dari kit kat ... gunakan clearApplicationUserData dan di atasnya menggunakan runtime.exce ... pada dasarnya perintah shell ... cukup dapat diandalkan selain izin ... seharusnya berfungsi ...
CrandellWS
13

Cara termudah untuk melakukannya adalah

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

Ini akan menghapus data dan menghapus aplikasi Anda dari memori. Ini setara dengan opsi hapus data di bawah Pengaturan -> Manajer Aplikasi -> Aplikasi Anda -> Hapus data

Menyimpulkan Jain
sumber
3
Saya tidak akan merekomendasikan pendekatan ini. Menggunakan program baris perintah (misalnya pm) yang mungkin tidak ada berisiko. Mereka bukan bagian dari "kontrak" Android SDK, jadi apakah mereka ada pada perangkat tertentu atau apakah mereka berperilaku sama seperti yang mereka lakukan pada perangkat lain terserah produsen dan pengembang ROM khusus.
CommonsWare
2
Sebagai alternatif, saya punya satu opsi lagi yaitu ((ActivityManager) context.getSystemService (ACTIVITY_SERVICE)) .clearApplicationUserData (); Tetapi itu memiliki batasan bahwa itu hanya berfungsi API level> = 19 Bisakah Anda memberikan alternatif di sini atau mungkin opsi lain.
Menjumlahkan Jain
2

Yang saya gunakan di mana-mana:

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

Menjalankan bagian kode di atas menutup aplikasi dan menghapus semua database dan preferensi bersama

Pehlaj - Pengembang Aplikasi Seluler
sumber
-1

Jika Anda menginginkan peretasan yang tidak terlalu bertele-tele:

void deleteDirectory(String path) {
  Runtime.getRuntime().exec(String.format("rm -rf %s", path));
}
Christopher Perry
sumber
1
Anda mungkin ingin mengutip jalur itu jika ada spasi dan semacamnya.
TWiStErRob