# Android 廣告提供設計思維 宗旨:由此去分配廣告由哪個平台提供 ## 類的定義 AdProvider:廣告供應商的類型,目前有 Google、Facebook 的廣告提供類型 AdType:廣告的類型,目前有 Interstitial、Banner 的廣告類型 AdObject:各類廣告的基礎接口 - InterstitialAd:插頁廣告 - showAd(): - loadAd() - BannerAd:橫幅廣告 AbstractAbFactory:統籌供應商能提供的各式廣告類型,例:橫幅、插頁廣告 - GoogleAdFactory - FacebookAdFactory AdListener:監聽廣告的各式行為 AdManager:對外的溝通的唯一窗口 ## 設計思維 一、 使用抽象工廠模式,設計出各個廣告平台的廣告工廠 創建 GoogleAdFactory、FacebookAdFactory,繼承於 AbstractAbFactory,並實現抽象方法`providerInterstitialAd`、`providerBannerAd` ,分別為創建插頁廣告及橫幅廣告 二、 再由給定的廣告呈現類型實例化廣告物件 ## 注意 - [x] 1. 使用插頁廣告,不需要將 Ad 設定到哪個頁面內,但橫幅廣告需要設定顯示的位置 解決方案: - 傳入 ViewGroup,當廣告加載完成,便將廣告添加至 ViewGroup 內 - [ ] 2. 插頁廣告復用,不能二次調用 show(),需重新調用 loadAd() 重新加載廣告 - Facebook - 當插頁廣告加載完成;isAdLoaded = true , isAdInvalidated = false - 顯示插頁廣告後,再次調用 show();isAdLoaded = false , isAdInvalidated = true - Google - 當插頁廣吿加載完成;isLoaded = true - 顯示插頁廣告後,再次調用 show();isLoaded = false - 結論:當插頁廣告顯示過後,已加載完成的廣告隨之無效;若需要重新顯示插頁廣告,則需重新調用 loadAd() - 解決方案:當需要顯示插頁廣告,判斷 isLoaded() - true:顯示插頁廣告 - false:加載廣告 - [ ] 3. 橫幅廣告重新加載 - Google - 當廣告已經顯示,調用 show() 將不起任何作用 - 當廣告已經顯示,再次調用 loadAd(),將重新加載廣告 - Facebook - 當廣告已經顯示,調用 show() 將不起任何作用 - 當廣告已經顯示,再次調用 loadAd(),將重新加載廣告 - 結論:當廣告已經加載成功,重新加載再次調用 loadAd() ## 未來展望 1. ~~目前僅只有設定同一個 廣告版位的 id,需提供給用戶設置 id~~ 2. ~~提供全域設置 google、facebook 平台的 id~~ - 只能在 Androidmanifest 設定 3. ~~提供用戶可以設置監聽,掌握廣告的狀況~~ 4. ~~使廣告可以被復用~~ AdSize AdSiez.Small ### Facebook public static final AdSize INTERSTITIAL = new AdSize(100); public static final AdSize BANNER_HEIGHT_50 = new AdSize(5); public static final AdSize BANNER_HEIGHT_90 = new AdSize(6); public static final AdSize RECTANGLE_HEIGHT_250 = new AdSize(7); ### Google public static final AdSize BANNER = new AdSize(320, 50, "320x50_mb"); public static final AdSize FULL_BANNER = new AdSize(468, 60, "468x60_as"); public static final AdSize LARGE_BANNER = new AdSize(320, 100, "320x100_as"); public static final AdSize LEADERBOARD = new AdSize(728, 90, "728x90_as"); public static final AdSize MEDIUM_RECTANGLE = new AdSize(300, 250, "300x250_as"); public static final AdSize WIDE_SKYSCRAPER = new AdSize(160, 600, "160x600_as"); public static final AdSize SMART_BANNER = new AdSize(-1, -2, "smart_banner");