轉載: http://blog.csdn.net/huxueyan521/article/details/8954844
通過windowmananger來在窗口上添加view的時候,需要設置alert參數,而且要添加alert權限
mLayoutParams = new WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, LayoutParams.TYPE_SYSTEM_ALERT, LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSPARENT); mLayoutParams.gravity = Gravity.LEFT | Gravity.TOP;
權限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
dialog是依附於activity存在的。但是app中經常需要使用以下的情況,在service中做一些后台操作,在某個臨界條件滿足時,顯示一個dialog告知用戶。
這時dialog無法直接從service中啟動起來,會報出android.view.WindowManager$BadTokenException:Unable to add window的錯誤。
解決方法有兩種:
1. 顯示一個系統界別的dialog,即全局性質的dialog。這種dialog在任何界面下都可以彈出來。但是,這種dialog不相應home鍵和返回鍵,即強制用戶必須對dialog作出操作后。
使用方法是在dialog.show()語句之前設置dialog的window的type是system alert型。如下:
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.show();
還需要在AndroidManifest.xml中增加權限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
2. 在dialog的背后加一個透明的activity。即先顯示一個透明的activity,在使用activity的context顯示dialog。需 要注意的是,activity在destroy的時候一定要把dialog給dismiss掉,否則activity消失但dialog還在,會 crash。
透明activity的創建方法是在AndroidManifest.xml中添加theme:
<activity android:name="com.a.b.activity" android:theme="@android:style/Theme.Translucent"> </activity>
另外,需要設置activity沒有actionbar,設置方法是在Activity的onCreate方法中增加:
requestWindowFeature(Window.FEATURE_NO_TITLE);