首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 多 Activity 共享同一播放視窗的最佳實踐:浮動窗口方案詳解

     編輯:程式設計疑難解答

需求場景

開發一個視頻播放相關項目,要求每個 Activity 界面都持有一個播放窗口,且播放同一視頻流。期望播放窗口在 Activity 切換時不銷毀、不重建、位置狀態保持不變。

為何普通 Activity 無法滿足

Android Activity 採用棧式管理,切換 Activity 會觸發完整生命週期(onPause → onStop → onDestroy),導致播放器被釋放、視頻中斷。即使使用 singleTask 或 singleInstance 啟動模式,也無法實現「窗口始終浮在所有界面之上」的視覺效果。

推薦方案:系統級浮動窗口

核心優勢

  • 脫離 Activity 生命週期:依附於 WindowManager,不隨 Activity 銷毀而銷毀。
  • 全局可見:可跨應用、跨界面懸浮顯示(需 SYSTEM_ALERT_WINDOW 權限)。
  • 播放狀態完美保持:MediaPlayer/ExoPlayer 實例長駐內存,切換界面零中斷。

實現關鍵點

  1. 聲明權限(Android 6.0+ 需動態申請):
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
  2. 創建 Service 承載窗口:
    在 Foreground Service 中調用 WindowManager.addView() 添加播放器 View(SurfaceView/TextureView + 控制層)。
  3. 窗口屬性配置:
    LayoutParams.TYPE_APPLICATION_OVERLAY(API 26+)或 TYPE_PHONE,設置 FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL | FLAG_WATCH_OUTSIDE_TOUCH 確保不攔截底層觸摸事件。
  4. 生命週期管理:
    Service onCreate 初始化播放器,onDestroy 釋放資源並 removeView;提供靜態方法/廣播供 Activity 控制播放/暫停/seek。

折中替代方案(若不想用浮窗)

  • 單 Activity + 多 Fragment:播放器放在 Activity 頂層容器,Fragment 切換不影響播放器實例。
  • Picture-in-Picture (PiP) 模式:Android 8.0+ 原生支持,用戶按 Home 鍵自動進入小窗播放,但無法在應用內部任意界面保持可見。

總結

對於「跨 Activity 持久化播放窗口」的剛性需求,Foreground Service + WindowManager 浮動窗口是唯一穩健、符合 Android 架構的方案。請根據目標 API 級別處理權限適配,並妥善管理播放器資源釋放,避免內存洩漏。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved