Android異常之android.view.WindowManager$BadTokenException

歡迎關注WX公衆號:
門徒與思索
Android開發中,很長出現這個問題。該異常表示不能添加窗口,通常是所要依附的view已經不存在導致的。

#7502 android.view.WindowManager$BadTokenException
Unable to add window -- token android.os.BinderProxy@62f99fc is not valid; is your activity running?

com.tcl.tsales_android.ui.MainActivity$8.onDeviceConnectFailed(MainActivity.java:731)

Dialog&AlertDialog,WindowManager不能正確使用時,經常會報出該異常,原因比較多,幾個常見的場景如下:

  • 1.上一個頁面沒有destroy的時候,之前的Activity已經接收到了廣播。如果此時之前的Activity進行UI層面的操作處理,就會造成crash。UI層面的刷新,一定要注意時機,建議使用set_result來代替廣播的形式進行刷新操作,避免使用廣播的方式,代碼不直觀且容易出錯。
  • 2.Dialog在Actitivty退出後彈出。在Dialog調用show方法進行顯示時,必須要有一個Activity作爲窗口的載體,如果Activity被銷燬,那麼導致Dialog的窗口載體找不到。建議在Dialog調用show方法之前先判斷Activity是否已經被銷燬。
  • 3.Service&Application彈出對話框或WindowManager添加view時,沒有設置window type爲TYPE_SYSTEM_ALERT。需要在調用dialog.show()方法前添加dialog.getWindow().SetType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)。
  • 4.6.0的系統上, (非定製 rom 行爲)若沒有給予懸浮窗權限, 會彈出該問題, 可以通過Settings.canDrawOverlays來判斷是否有該權限.
  • 5.某些不穩定的MIUI系統bug引起的權限問題,系統把Toast也當成了系統級彈窗,android6.0的系統Dialog彈窗需要用戶手動授權,若果app沒有加入SYSTEM_ALERT_WINDOW權限就會報這個錯。需要加入給app加系統Dialog彈窗權限,並動態申請權限,不滿足第一條會出現沒權限閃退,不滿足第二條會出現沒有Toast的情況。

以上就是可能引起的原因和解決方案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章