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

Android onDestroy 發送廣播導致 Window Leaked 錯誤

     編輯:程式設計綜合問答

錯誤現象

onDestroy() 中發送廣播後,報 Activity ... has leaked window ... DecorView。去掉廣播代碼則正常。

原因分析

  • 對話框/PopupWindow 未關閉:Activity 銷毀前,仍有附加在 Window 上的 View(如 Dialog、ProgressDialog、PopupWindow)未 dismiss()。
  • sendBroadcast() 可能觸發其他組件彈窗,或廣播接收器中異步彈窗,導致 Window 持有引用。
  • 部分機型系統版本對 Window 管理更嚴格,同代碼在不同手機表現不一(如題主換手機即解決)。

解決方案

  1. onDestroy 前確保所有對話框已 dismiss:
    @Override
    protected void onDestroy() {
        if (dialog != null && dialog.isShowing()) dialog.dismiss();
        if (popupWindow != null && popupWindow.isShowing()) popupWindow.dismiss();
        // 再發送廣播
        sendBroadcast(new Intent(...));
        super.onDestroy();
    }
    
  2. 使用 Application Context 發送廣播:避免持有 Activity Context。
    getApplicationContext().sendBroadcast(intent);
  3. 異步廣播改為有序廣播或 LocalBroadcastManager:
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);(進程內,輕量)。
  4. 檢查是否在線程中彈窗:UI 操作必須在主線程,runOnUiThread 或 Handler。

最佳實踐

  • 對話框生命周期綁定 Activity:onPause/onStop dismiss,onResume show。
  • 使用 DialogFragment 替代原生 Dialog,系統自動管理生命周期。
  • 發送廣播無需等待響應,若需結果用 sendOrderedBroadcast + BroadcastReceiver。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved