[Android Pro] service中顯示一個dialog 或者通過windowmanage顯示view


轉載: 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);   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM