Android **不允許** App 在被解除安裝的過程中執行代碼(進程會被直接殺死)。但可透過**另一個已安裝的 App** 監聽 Intent.ACTION_PACKAGE_REMOVED 廣播來代為清理,或在 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 輪詢檢查。
public void resetAllData() {
// 1. 刪除資料庫
deleteDatabase(DATABASE_NAME);
// 2. 清除 SharedPreferences
PreferenceManager.getDefaultSharedPreferences(this).edit().clear().apply();
// 3. 刪除內部檔案目錄
File filesDir = getFilesDir();
deleteRecursive(filesDir);
// 4. 重新初始化或引導登入
}
引導使用者在設定中點擊「重置資料」或「登出並清除快取」,體驗更可控、無需額外 App。
若資料放在 getExternalFilesDir(),解除安裝時系統會自動刪除該目錄(API 19+)。但內部儲存(/data/data/pkg)一定會連同 App 一起刪除,**資料庫其實會自動被清除**,除非你用了備份功能或放在外部儲存。
**一般情況下,解除安裝會自動刪除 App 專屬資料庫與內部檔案**,無需額外代碼。若發現資料殘留,請確認是否:
android:allowBackup="true" 且使用者還原備份?針對上述情況再採取方案 B 或 C 處理。