Android懸浮窗DEMO和碰到的坑

一、懸浮窗原理

應用使用Context上下文獲取WINDOW_SERVICE獲取WindowManager
通過調用addView() removeView()兩個方法來顯示和移除View

WindowManager mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

需要注意這里的Context上下文,在絕大多數非原生系統上,context上下文會影響懸浮窗的顯示范圍。
在MIUI和華為等國產系統上,使用Activity的Context只能顯示在Activity里,一旦后臺就看不見了。
所以你的懸浮窗需要后臺顯示,就一定要使用getApplicationContext()

二、添加一個懸浮窗
WindowManager.LayoutParams mWindowParams = new WindowManager.LayoutParams( 
                WindowManager.LayoutParams.WRAP_CONTENT,      
                WindowManager.LayoutParams.WRAP_CONTENT,              
                WindowManager.LayoutParams.TYPE_TOAST,                      
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
                PixelFormat.RGBA_8888);
if (Build.VERSION.SDK_INT < 19 ) {   
    mWindowParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
}
mWindowManager.addView(view,mWindowParams );
public LayoutParams(int w, int h, int _type, int _flags, int _format)

當你需要一個后臺懸浮窗時,_type這個參數得注意和了解一下,推薦使用TYPE_TOAST

  • TYPE_TOAST
    優點 : 無需開啟懸浮窗權限,缺點:API < 19 時無法處理觸控操作
  • TYPE_SYSTEM_ALERT
    缺點 需要開啟懸浮窗權限

當然還有其他的_type,根據自己的需求去使用對應的類型

三、移除一個懸浮窗
removeView...................
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,353評論 25 708
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,524評論 0 17
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,948評論 18 139
  • 工作日早上的地鐵,永遠有很長的隊列需要排,但是幸好我是住在地鐵某條線的首發站,排隊的人并不算特別多。 那一站地鐵有...
    栗子醬舉個栗子閱讀 743評論 0 0
  • 那一年。 三月春風吹暖那片小村莊, 他認識了她 。 她野百合一般的性子, 不拘束、隨性有點小任性。 她名字-...
    丨雪色丶咖啡茶閱讀 199評論 0 0