Android通用業務彈窗管理方案PopLayerV1

lalala同學發表於2019-03-02

前言

在Android圈裡關於彈窗的開源框架還是挺多的,但是大多數擴充套件都是針對於樣式,像是一種型別的彈窗開發者傳入不同的引數就能在UI效果上顯示不同的特效,這樣的擴充套件的確是十分方便但在我們具體工作業務開發中,UI對彈窗樣式的追求上 就顯得有些雞肋,基本上業務場景每種型別的彈窗介面效果都大不相同做不到真正意義上的介面統一

這裡對於將要介紹的方案 著重的不在於UI效果 而在於 彈窗的業務邏輯

思想理念

得益於markzhai的任務流概念將App初始化的流程抽象為flow、wave和task 三個階段類別的想法

我整理了彈窗相關的一些類別 (ps:這裡的彈窗不再是Dialog通常的概念)

public enum PopType {
    DIALOG,
    WEBVIEW,
    WIDGET,
    POUPOWINDOW,
    TOAST,
    SNACKBAR,
    OTHERS
}
複製程式碼

我也嘗試著將這些繁雜的彈窗統一抽象為一體 也就是本框架中的核心成員之一 —— PopLayerView

它是一個彈窗view但又不繼承於View 並且具備原生彈窗show,hide等基本功能

它可以是上面列出的彈窗的任何一種 只需要傳入你的具體彈窗策略

框架產於需求終於需求 需求文件裡 可能需要你將彈窗延遲固定的時間並消失 一些活動彈窗需要你在具體的時間段失效 又或者是當運營下發多個活動視窗時 該如何滿足他們需求的管理這些彈窗

面對上述的這些問題

彈窗就不限於彈窗本身了,它必須具備裝配各種業務相匹配的能力

1.時間範圍管理 2.顯示彈窗次數管理 3.優先順序設定 4.顯示時間配置

Poplayer內部維護了 PopLayerController 裝配彈窗業務功能的成員來滿足這些場景

成員 PopManager 維護了對應的彈窗優先順序佇列 保證彈窗流程正常進行

綜上暫時滿足目前的需求,希望這樣的思想理念能得到您的贊同

具體使用

關於Poplayer的具體使用 您可以去 Github:github.com/MrCodeSnipe… 上瀏覽希望對您有所幫助

//add this to your repositories
 maven { url 'https://www.jitpack.io' }

//add this to your dependencies
implementation 'com.github.MrCodeSniper:PopLayer:2.0.0'
複製程式碼

關於彈窗管理

這裡 我將每個彈窗物件 當成一個彈窗實體 在框架裡稱為 Popi

它是一個描述視窗的最小不可分割實體 具備所有描述彈窗的屬性且可以按照需求擴充套件

在使用時 只需按照您的需求 裝配對應的業務需求即可

Popi mUpgradePopi1 = new Popi.Builder()
                .setmPopId(4)//彈窗的唯一標識 當id發生改變 視為新的彈窗
                .setmPriority(2)//優先順序這裡不具體劃分對應的範圍 值越小優先順序越高
                .setmCancelType(TRIGGER_CANCEL)//彈窗消失的型別分為 TRIGGER_CANCEL(觸控消失) COUNTDOWN_CANCEL (延時消失)
                .setMaxShowTimeLength(5)//最長顯示時間(S)
                .setMaxShowCount(5)//最大顯示次數
                .setmBeginDate(1548858028)//開始時間 2019-01-30 22:20:28
                .setmEndDate(1548944428)//結束時間 2019-01-31 22:20:28
                .setmPopLayerView(mLayerView1)//彈窗View
                .build();
複製程式碼

之前說過傳入具體彈窗策略 建立對應的彈窗 即下文中的傳入dialog彈窗的策略 拿到之前統一的PopLayerView物件交由Popi管理即可

//Dialog形式
PopLayerView  mLayerView = new PopLayerView(this,R.layout.common_dialog_upgrade_app);
//透明Webview形式
PopLayerView mLayerView = new PopLayerView(this,LayerConfig.redPocketScheme);
複製程式碼

如何實現彈窗優先順序的業務邏輯

之前說到 成員 PopManager 維護了對應的彈窗優先順序佇列 保證彈窗流程正常進行,最後的顯示和隱藏也是在其操作之後

首先Popi實體實現了Comparable介面 使其具備通過優先順序比較大小的能力

其次也就是內部的優先順序佇列 每新增刪除一個元素都會進行堆排序對佇列進行優先順序調整

private  PriorityQueue<Popi> queue;
複製程式碼

當彈窗實體Popi入隊中 會先通過判斷其Id是否重複 來判斷是否將其入隊

在顯示時根據傳入的Popi對應的屬性依次判斷其是否滿足

1.在限定的活動時間內

2.通過SP儲存相應彈窗的顯示次數 key為Popi加上其唯一的ID 判斷顯示次數是否超出範圍

3.如果取消型別為延遲取消 增加DelayDimiss

若流程無法走出的彈窗實體會被移出佇列

具體的使用也非常簡單

//納入彈窗管理
PopManager.getInstance().pushToQueue(mUpgradePopi);
//開始顯示彈窗
PopManager.getInstance().showNextPopi();
複製程式碼

效果預覽

Android通用業務彈窗管理方案PopLayerV1

框架目前的缺陷

目前還沒有好的方法來監聽原生的控制元件消失的回撥

類似dialog 點選圈外時 是不走我們的Poplayer消失邏輯的

需要加上監聽 但這使得Poplayer內部的邏輯有些紊亂

目前的解決辦法是 統一彈窗的 觸控機制 分為實體和外圍區域 將其納入我們的管理範圍內

隨著PoplayerV2的釋出 觸控機制 已經有預設不同擴充套件的實現 基本上實現統一

關於專案

V1方案

版本號 LOG 進度更新
V1.0.0 專案開源,完成彈窗管理與Dialog形式擴充套件 Dialog策略擴充套件完成
V1.0.1 修復Dialog策略無法獲取dialog實體bug Dialog策略優化
V1.0.2 修復activity摧毀造成的彈窗異常 bug Dialog策略優化
V1.0.3 優化了彈窗的使用更加方便快捷 框架使用優化

V2方案

版本號 LOG 進度更新
V2.0.0 正式加入透明Webview彈窗策略擴充套件 透明Webview策略擴充套件完成

未來的計劃

基於透明的Webview的擴充套件已經完成 各位看官可以去

Android通用業務彈窗管理方案PopLayerV2去看相關效果

有點類似於手淘在其云溪社群提供的方案從全方面統籌webview

其他型別的彈窗也會陸續更新 希望能提供給大家一個較為全面的應對業務需求的彈窗管理框架


作者介紹

Hello 我叫lalala,如果您喜歡我的文章,可以去我的Github給個Star我就很開心啦!

Github:github.com/MrCodeSnipe…

Thanks To 手淘在其云溪社群提供的方案提供的封面圖片

--End

相關文章