ActivityGroup中的子Activity创建Dialog:android.view.WindowManager$BadTokenException: U
我們在ActivityGroup或者TabActivity中的子Activity創(chuàng)建Dialog若使用以下的代碼
progressDialog = new ProgressDialog(XXX.this)
創(chuàng)建就會出現(xiàn)如下Exception
05-24 12:34:42.236: ERROR/AndroidRuntime(6362): android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@43e5b158 is not valid; is your activity running?
而該使用:
progressDialog = new ProgressDialog(getParent())
若ActivityGroup中嵌套ActivityGroup,嵌套多少就該使用多少個getParent()。
為什么要使用getParent我們可以從柯元旦的《Android內(nèi)核剖析》中第十章”Ams內(nèi)部原理“中的ActivityGroup的內(nèi)部機(jī)制來理解:
TabActivity的父類是ActivityGroup,而ActivityGroup的父類是Activity。因此從Ams的角度來看,ActivityGroup與普通的Activity沒有什么區(qū)別,其生命周期包括標(biāo)準(zhǔn)的start,stop,resume,destroy等,而且系統(tǒng)中只允許同時允許一個ActivityGroup.但ActivityGroup內(nèi)部有一個重要成員變量,其類型為LocalActivityManager,該類的最大特點(diǎn)在于它可以訪問應(yīng)用進(jìn)程的主類,即ActivityThread類。Ams要啟動某個Activity或者贊同某個Activity都是通過ActivityThread類執(zhí)行的,而LocalActivityManager類就意味著可以通過它來裝載不同的Activity,并控制Activity的不同的狀態(tài)。注意,這里是裝載,而不是啟動,這點(diǎn)很重要。所謂的啟動,一般是指會創(chuàng)建一個進(jìn)程(如果所在的應(yīng)用經(jīng)常還不存在)運(yùn)行該Activity,而裝載僅僅是指把該Activity作為一個普通類進(jìn)行加載,并創(chuàng)建一個該類的對象而已,而該類的任何函數(shù)都沒有被運(yùn)行。裝載Activity對象的過程對AmS來講是完全不可見的,那些嵌入的Activity僅僅貢獻(xiàn)了自己所包含的Window窗口而已。而子Activity的不同狀態(tài)是通過moveToState來處理的。
所以子Activity不是像普通的Activity一樣,它只是提供Window而已,所以在創(chuàng)建Dialog時就應(yīng)該使用getParent獲取ActivityGroup真正的Activity,才可以加Dialog加入Activity中。
總結(jié)
以上是生活随笔為你收集整理的ActivityGroup中的子Activity创建Dialog:android.view.WindowManager$BadTokenException: U的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 调用startActivityForRe
- 下一篇: Android Launcher 分析