অ্যাপ্লিকেশন এর ডেটা প্রোগ্রাম্যাটিকভাবে সাফ করুন


120

আমি আমার অ্যাপ্লিকেশনটির ডেটা প্রোগ্রামগতভাবে সাফ করতে চাই।

অ্যাপ্লিকেশনটির ডেটাতে ডেটাবেস, ভাগ করা পছন্দসমূহ, অভ্যন্তরীণ-বাহ্যিক ফাইল বা অ্যাপ্লিকেশনটির মধ্যে তৈরি অন্য কোনও ফাইলের মতো কিছু থাকতে পারে।

আমি জানি যে এর মাধ্যমে আমরা মোবাইল ডিভাইসে ডেটা সাফ করতে পারি:

সেটিংস-> অ্যাপ্লিকেশন-> পরিচালনা অ্যাপ্লিকেশন-> মাই_প্লিকেশন-> ডেটা সাফ করুন

তবে আমার কি অ্যান্ড্রয়েড প্রোগ্রামের মাধ্যমে উপরের জিনিসটি করা দরকার?

উত্তর:


110

এপিআই 19 (কিটকাট) এ একটি নতুন এপিআই চালু হয়েছে: অ্যাক্টিভিটি ম্যানেজার.ক্লিয়ার অ্যাপ্লিকেশন ইউজারডাটা ()

আমি এটি নতুন অ্যাপ্লিকেশনগুলিতে ব্যবহার করার জন্য অত্যন্ত পরামর্শ দিচ্ছি:

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

আপনি যদি হ্যাকি উপায়টি না চান তবে আপনি ইউআইতে বোতামটিও আড়াল করতে পারেন, যাতে কার্যকারিতা কেবল পুরানো ফোনে পাওয়া যায় না।

এই পদ্ধতির জ্ঞান যে কেউ ব্যবহার করছে তাদের জন্য বাধ্যতামূলক android:manageSpaceActivity


আমি যখনই এটি ব্যবহার করি, তখন manageSpaceActivityযা আছে তা থেকে এটি করি android:process=":manager"। সেখানে আমি আমার অ্যাপ্লিকেশনটির অন্য কোনও প্রক্রিয়াটি ম্যানুয়ালি হত্যা করি। এটি আমাকে একটি ইউআই চালিয়ে যেতে দেয় এবং ব্যবহারকারীকে কোথায় যেতে হবে তা স্থির করতে দেয়।

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
আমার জন্য .CararApplicationUserData (); পাশাপাশি অ্যাপ্লিকেশন বন্ধ করতে বাধ্য করা হচ্ছে।
gaurav414u

9
এটি অ্যাপ্লিকেশনটি মেরে ফেলতে হবে, নাহলে এটির কাছে থাকা ডেটা থাকতে পারে এটি আবার লেখা হবে। এটি করার একমাত্র নিরাপদ উপায় হ'ল (১) অ্যাপ্লিকেশনটি হত্যা করা, (২) এর সমস্ত ডেটা সাফ করা, (৩) পরের বার অ্যাপটি শুরু হওয়ার পরে এটি কোনও ডেটা ছাড়াই নতুন করে শুরু হবে।
হ্যাকবড

4
হাই @TWiStErRob আমার অ্যাপ্লিকেশনটিতে লোগুট বোতামে ক্লিক করার পরে আমি এই পদ্ধতিটি প্রয়োগ করতে চাই। তবে এটি অ্যাপটিকে জোর করে বন্ধ করে দেয়। পরিবর্তে আমি যেখানে সাইনআপ / সাইন ইন ফর্ম উপস্থিত সেখানে প্রধান ক্রিয়াকলাপ শুরু করতে চাই .. এটি কীভাবে সম্ভব হবে?
pblead26

1
: প্রাক কিটক্যাট সংস্করণের জন্য এই উত্তরটি দেখুন stackoverflow.com/a/23470355/3256989
ultraon

2
এই কোডটি প্রয়োগ করার পরে কি অন্য কোনও ক্রিয়াকলাপ শুরু করা সম্ভব
অমনদীপ রোহিলা

106

আমি এই পোস্টে এখানে পোস্ট করা লিঙ্ক 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 () কল করতে হবে। অনক্লিকলিস্টারের মধ্যে থেকে ক্লিয়ার অ্যাপ্লিকেশনডেটা ()

আপডেট: আপনার SharedPreferencesউদাহরণটি আপনার ডেটা ধরে রাখতে পারে এবং পছন্দগুলি মুছার পরে এটি পুনরায় তৈরি করতে পারে। সুতরাং আপনি আপনার SharedPreferencesঅবজেক্ট পেতে চান এবং

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

হালনাগাদ:

আপনি যোগ করতে হবে android:name="your.package.MyApplication"করতে application tagভিতরে Andro আইডি যদি আপনি এটি না করে ছিল। অন্যথায়, MyApplication.getInstance()ফিরে আসে null, যার ফলে একটি নালপয়েন্টার এক্সসেপশন হয়


5
যত্ন নিবেন ! আপনি শেয়ারের পছন্দগুলি সহ অ্যাপ্লিকেশন ফোল্ডারে প্রতিটি জিনিস মুছে ফেলেন .. কেবল ক্যাশে নিজেই নয় এবং এর সামগ্রীগুলিও।
Snicolas

2
আমি এই সমাধানটি কার্যকর করেছি। তবে আমার অ্যাপ্লিকেশন ডেটা সাফ করা হয় না কেবল ক্যাশে সাফ করা হয় .. 5 এমবি এখনও বাকি আছে .. অন্য কোনও সমাধান ?? দয়া করে আমাকে সাহায্য করুন :(
সুইটওয়িশার ツ

1
@ ম্যানসম্যান দয়া করে উল্লেখ করুন যে এটি আরও ভাল প্রভাবের জন্য অ্যাপ্লিকেশনটিকে প্রসারিত শ্রেণিতে লিখতে হবে
ক্রাইপি_ড্রাইভার

লিব রাখার জন্য খুব স্মার্ট।
হিমশীতল

1
হ্যাঁ এটি সমস্ত ফাইল সরিয়ে ফেলল কিন্তু অ্যাপ্লিকেশনটি বুঝতে পারা যায় নি তাই আমি অ্যাপ্লিকেশন ডায়ারে ফাইল হতে পারি। অ্যাপ্লিকেশনটি সাম্প্রতিক অ্যাপ্লিকেশন থেকে অপসারণ অ্যাপ্লিকেশনটি ক্লিয়ারিংয়ের পরে উপলব্ধি করেছে। আমি ক্রিয়াকলাপটি পুনরায় তৈরি করার চেষ্টা করেছি তবে এটি কার্যকর হয়নি
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();
    } 
}

এটি অ্যান্ড্রয়েড সংস্করণ নির্বিশেষে সমস্ত অ্যান্ড্রয়েড ডিভাইসে কাজ করবে? আমার জন্য, এটা (Lollipop এ, Marshmallow এ এবং পাই সঙ্গে) 3 অ্যান্ড্রয়েড ডিভাইসের আমি মালিক উপর কাজ করে
কাসীর

হ্যাঁ, যদি অন্য কোনও কিট কেটের চেয়ে সমান বা তার চেয়ে কম হয় ... ক্লিয়ার অ্যাপ্লিকেশন ইউজারডাটা ব্যবহার করুন এবং উপরে এটি রানটাইম.এক্সেস ব্যবহার করে ... মূলত শেল কমান্ড ... অনুমতি ব্যতীত অন্যথায় নির্ভরযোগ্য ... এটি কেবল কাজ করা উচিত ...
CrandellWS

12

এটি করার সহজ উপায়

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) ব্যবহার করা আপনার পক্ষে ঝুঁকিপূর্ণ। এগুলি অ্যান্ড্রয়েড এসডিকে "চুক্তি" এর অংশ নয়, এবং তাই তারা কোনও প্রদত্ত ডিভাইসে উপস্থিত রয়েছে বা তারা অন্য ডিভাইসে যেমন আচরণ করে তেমনি নির্মাতারা এবং কাস্টম রম বিকাশকারীদের উপর নির্ভর করে।
CommonsWare

2
বিকল্প হিসাবে আমার কাছে আরও একটি বিকল্প রয়েছে (যেমন (অ্যাক্টিভিটি ম্যানেজার) কনটেক্সট.জিটসিসটেম সার্ভিসেস (ACTIVITY_SERVICE)) .CararApplicationUserData (); তবে এটির একটি সীমাবদ্ধতা রয়েছে যা এটি কেবলমাত্র API স্তরের কাজ করে> = 19 আপনি এখানে দয়া করে বিকল্প সরবরাহ করতে পারেন বা অন্য কোনও বিকল্প হতে পারে।
15:57

2

আমি সর্বত্র যা ব্যবহার করি:

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

উপরের অংশের কোডটি কার্যকর করা অ্যাপ্লিকেশনটি বন্ধ করে এবং সমস্ত ডাটাবেস এবং ভাগ করা পছন্দগুলি সরিয়ে দেয়


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