首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android App 解除安裝時清理資料庫:監聽 PACKAGE_REMOVED 廣播

     編輯:程式設計綜合問答

可行性說明

Android **不允許** App 在被解除安裝的過程中執行代碼(進程會被直接殺死)。但可透過**另一個已安裝的 App** 監聽 Intent.ACTION_PACKAGE_REMOVED 廣播來代為清理,或在 App 內部於「使用者主動登出/重置」時清理。

方案 A:雙 App 協作(需使用者安裝兩支 App)

主 App 註冊廣播接收器:

<receiver android:name=".UninstallReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <data android:scheme="package" />
    </intent-filter>
</receiver>
public class UninstallReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String pkg = intent.getData().getSchemeSpecificPart();
        if ("com.your.mainapp".equals(pkg)) {
            context.deleteDatabase("your_db_name"); // 清理目標 App 資料庫
            // 或刪除 SharedPreferences、內部儲存檔案
        }
    }
}

限制:Android 8.0+ 隱性廣播限制,需動態註冊或使用 JobScheduler/WorkManager 輪詢檢查。

方案 B:App 內部提供「重置資料」功能(推薦)

public void resetAllData() {
    // 1. 刪除資料庫
    deleteDatabase(DATABASE_NAME);
    // 2. 清除 SharedPreferences
    PreferenceManager.getDefaultSharedPreferences(this).edit().clear().apply();
    // 3. 刪除內部檔案目錄
    File filesDir = getFilesDir();
    deleteRecursive(filesDir);
    // 4. 重新初始化或引導登入
}

引導使用者在設定中點擊「重置資料」或「登出並清除快取」,體驗更可控、無需額外 App。

方案 C:利用 android:allowBackup="false" + 外部儲存

若資料放在 getExternalFilesDir(),解除安裝時系統會自動刪除該目錄(API 19+)。但內部儲存(/data/data/pkg)一定會連同 App 一起刪除,**資料庫其實會自動被清除**,除非你用了備份功能或放在外部儲存。

結論

**一般情況下,解除安裝會自動刪除 App 專屬資料庫與內部檔案**,無需額外代碼。若發現資料殘留,請確認是否:

  • 資料庫建立在外部儲存(SD 卡)?
  • 啟用了 android:allowBackup="true" 且使用者還原備份?
  • 使用了多進程共享資料庫?

針對上述情況再採取方案 B 或 C 處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved