【最新鴻蒙應用開發】——實用廣告思路,可動態修改(方便運營)

鴻蒙項目加入廣告展示頁業務

廣告頁的思路——華為有廣告業務,但是我們不用- ad模塊;

想自定義廣告——場景: app啟動-有廣告需求,就打開廣告頁,沒有的話就去登錄或者主頁;

騰訊體育的廣告- 啟動有廣告頁,退到后臺的情況下,再次進入前臺也會有廣告;

一、分析需求:

廣告頁作為一個app啟動的首頁,應該是在我們應用啟動就進去的。

  • 有的app有的需要廣告頁,有的不需要,搞個配置唄!!!

二、思路

  1. 通過首選項配置存儲我們的一些常用配置,比如要不要廣告頁,還有廣告頁的路由地址,點擊廣告頁跳轉的鏈接,廣告頁倒計時的秒數

  2. 在入口處進行判斷是否需要廣告頁,需要的話,跳轉廣告頁-廣告頁根據設置的參數進行渲染

  3. 問題來了,因為運營人員肯定不能每次都去改我們底層的代碼-這里我還可以設置成動態的-就是初始化的時候通過請求去讀一下云端的請求,然后把我們的圖片和一些參數配置下來,這樣每次你啟動app就是運營人員給你配置的廣告和設置了

三、開搞

  • 新建一個關于廣告類的數據模型-basic- models/advert.ets

export class AdvertClass {showAd: boolean = false // 顯示廣告adTime: number = 5 // 廣告時長adUrl?: string = '' // 廣告鏈接adImg?: ResourceStr = '' // 廣告圖片
}
  • 在model/index.ets中進行統一導出

export * from './advert'
  • 在utils中新建一個關于讀取首選項的類,用來讀取和設置首選項的廣告設置- utils/setting.ets

import { AdvertClass } from '../models'
import preferences from '@ohos.data.preferences'
import { USER_SETTING, USER_SETTING_AD } from '../constants'
// 默認廣告選項
const defaultAd: AdvertClass = {showAd: true,adTime: 5,adImg: $r('app.media.start')
}
export class UserSettingClass {context: Contextconstructor(context: Context) {this.context = context}// 獲取存儲用戶信息的首選項倉庫getStore () {return preferences.getPreferences(this.context, USER_SETTING)}// 設置用戶廣告設置async setUserAd (ad: AdvertClass) {const adStore = await this.getStore()await adStore.put(USER_SETTING_AD, JSON.stringify(ad))await adStore.flush()}// 獲取廣告配置async getUserAd (): Promise<AdvertClass> {const ?adStore = await this.getStore()return ?JSON.parse(await adStore.get(USER_SETTING_AD, JSON.stringify(defaultAd)) as string) as AdvertClass}
}

在上面代碼中,我們設計了讀取和設置廣告的兩個方法,并且提供了一個默認廣告的設置

  • 在utils中統一導出

export * from './setting'
  • 上面還用到了兩個常量,我們同樣需要在constants目錄下定義一個文件專門用來記錄-setting

export const USER_SETTING = 'fast_driver_setting' // 用來存儲用戶設置的首選項的key
export const USER_SETTING_AD = 'fast_driver_setting_ad' // 用來存儲用戶設置廣告首選項的key
  • 同樣在constants/index.ets文件中導出

export * from './setting'
  • 在basic/Index.ets統一導出

export * from './src/main/ets/models'
export * from './src/main/ets/constants'
export * from './src/main/ets/utils'

entry模塊-oh-package.json5

  • 在ability中引入該har包依賴

{"name": "entry","version": "1.0.0","description": "Please describe the basic information.","main": "","author": "","license": "","dependencies": {"@hm/basic":"file:../common/basic"}
}

ability中判斷

  • 導入包

import { AdvertClass, UserSettingClass } from '@hm/basic'
  • 判斷

 async onWindowStageCreate(windowStage: window.WindowStage): Promise<void> {// Main window is created, set main page for this ability// 檢查是否有廣告const setting = new UserSettingClass(this.context) // getContext拿到的是undefined//const ad = await new Promise<AdvertClass>((resolve, reject) => {setTimeout(() => {resolve(defaultAd) // 廣告信息}, 500)// resolve()})// 通過模擬請求拿到廣告信息await setting.setUserAd(ad) // 寫入首選項if(ad.showAd) {// 展示廣告的情況 展示廣告頁 有時限// 創建一個子窗口 子窗口加載廣告 廣告播完 窗口銷毀}windowStage.loadContent('pages/Index'); // 正常加載頁面}

這里我們模擬了一個請求,給了一個默認廣告, 寫入首選項-正常加載主頁

  1. 在pages下新建Start目錄,下面新建Start的page頁面

img

  • 實現Start頁的頁面結構及倒計時邏輯

import { UserSettingClass, AdvertClass } from '@hm/basic'
?
@Entry
@Component
struct Start {userSetting: UserSettingClass = new UserSettingClass(getContext(this))@StateadObj: AdvertClass ?= {showAd: false,adTime: 0}timer: number = -1async aboutToAppear() {this.adObj = await this.userSetting.getUserAd()this.timer = setInterval(() => {if(this.adObj.adTime === 0) {clearInterval(this.timer)return}this.adObj.adTime--}, 1000)}build() {Stack({ alignContent: Alignment.TopEnd }) {Image(this.adObj.adImg).objectFit(ImageFit.Cover)Text(`${this.adObj.adTime}秒后跳過`).padding({ left: 10, right: 10 }).margin({ right: 20, top: 20 }).height(30).fontSize(14).borderRadius(15).backgroundColor($r("app.color.background_page")).textAlign(TextAlign.Center)
?}.height('100%').width('100%')}
}

  • 使用子窗口模式加載廣告

我們可以使用windowStage的createSubWindow來實現在當前頁面上創建一個窗口

 if (result.showAd) {const win = await windowStage.createSubWindow("ad_window")await win.showWindow()win.setUIContent("pages/Start/Start")}
  • 廣告頁在廣告結束或者點擊跳過廣告時,關閉廣告

Start/Start頁面

closeWin () {window.findWindow("ad_window").destroyWindow()
}
  • 完成Start頁面代碼

import { UserSettingClass, AdvertClass } from '@hm/basic'
import { window } from '@kit.ArkUI'
?
@Entry
@Component
struct Start {userSetting: UserSettingClass = new UserSettingClass(getContext(this))@StateadObj: AdvertClass ?= {showAd: false,adTime: 0}timer: number = -1closeWin () {window.findWindow("ad_window").destroyWindow()}async aboutToAppear() {this.adObj = await this.userSetting.getUserAd()this.timer = setInterval(() => {if(this.adObj.adTime === 0) {clearInterval(this.timer)this.closeWin()return}this.adObj.adTime--}, 1000)}aboutToDisappear(): void {clearInterval(this.timer)} build() {Stack({ alignContent: Alignment.TopEnd }) {Image(this.adObj.adImg).objectFit(ImageFit.Cover)Text(`${this.adObj.adTime}秒后跳過`).padding({ left: 10, right: 10 }).margin({ right: 20, top: 20 }).height(30).fontSize(14).borderRadius(15).backgroundColor($r("app.color.background_page")).textAlign(TextAlign.Center).onClick(() => {this.closeWin()})
?}.height('100%').width('100%')}
}

這里請注意-如果需要使用線上的廣告圖片,需要開啟網絡權限

完整代碼-EntryAbility

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';
import { AdvertClass, UserSettingClass } from '@hm/basic'
?
export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');}
?onDestroy(): void {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');}
?async onWindowStageCreate(windowStage: window.WindowStage): Promise<void>  {// Main window is created, set main page for this abilityhilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');// 這里要嘗試去讀一下運營的配置-我們現在還沒有實現接口,直接模擬一下const userSetting = new UserSettingClass(this.context)const result = await new Promise<AdvertClass>((resolve, reject) => {setTimeout(() => {resolve({showAd: true,adTime: 5,adImg: $r("app.media.start")} as AdvertClass)}, 500)})await userSetting.setUserAd(result) // 寫入首選項if (result.showAd) {const win = await windowStage.createSubWindow("ad_window")await win.showWindow()win.setUIContent("pages/Start/Start")}windowStage.loadContent('pages/Index');}
?onWindowStageDestroy(): void {// Main window is destroyed, release UI related resourceshilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');}
?onForeground(): void {// Ability has brought to foregroundhilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');}
?onBackground(): void {// Ability has back to backgroundhilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');}
}

到此廣告功能就搞定了!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21537.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21537.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21537.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

適合小白學習的項目1894java開發ssm框架校園跑腿管理系統myeclipse開發mysql數據庫springMVC模式java編程計算機網頁設計

一、源碼特點 java ssm 校園跑腿管理系統是一套完善的web設計系統&#xff08;系統采用SSM框架進行設計開發&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;對理解JSP java編程開發語言有幫助&#xff0c;系統具有完整的源代碼和數據庫&#xff0c;系統主要采…

Java項目:96 springboot精品在線試題庫系統

作者主頁&#xff1a;舒克日記 簡介&#xff1a;Java領域優質創作者、Java項目、學習資料、技術互助 文中獲取源碼 項目介紹 這次開發的精品在線試題庫系統有管理員&#xff0c;教師&#xff0c;學生三個角色。 管理員功能有個人中心&#xff0c;專業管理&#xff0c;學生管理…

比較(二)利用python繪制雷達圖

比較&#xff08;二&#xff09;利用python繪制雷達圖 雷達圖&#xff08;Radar Chart&#xff09;簡介 雷達圖可以用來比較多個定量變量&#xff0c;也可以用于查看數據集中變量的得分高低&#xff0c;是顯示性能表現的理想之選。缺點是變量過多容易造成閱讀困難。 快速繪制…

Go語言 一些問題了解

一、讀取文件數據&#xff0c;是阻塞還是非阻塞的&#xff1f; 分兩種情況&#xff1a;常規讀取文件數據&#xff0c;和網絡IO讀取數據 1. 常規讀取文件數據&#xff1a; io.Reader 和 bufio.Reader 是同步進行的。 bufio.Reader 提供緩沖的讀取操作&#xff0c;意味著數據是…

網站入門:Flask用法講解

Flask是一個使用Python編寫的輕量級Web服務框架&#xff0c;旨在幫助開發人員快速構建和部署Web應用程序。下面將對Flask進行更為詳細的解釋說明&#xff0c;并展示其使用示例與注意事項&#xff1a; 1.解釋說明 定義及特點: Flask以其簡潔和靈活著稱&#xff0c;允許開發者以…

C++:list模擬實現

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起學習《C&#xff1a;list模擬實現》&#xff0c;感謝大家對我上一篇的支持&#xff0c;如有什么問題&#xff0c;還請多多指教 &#xff01; 如果本篇文章對你有幫助&#xff0c;還請各位點點贊&#xff01;&#xf…

LeetCode題練習與總結:二叉樹展開為鏈表--114

一、題目描述 給你二叉樹的根結點 root &#xff0c;請你將它展開為一個單鏈表&#xff1a; 展開后的單鏈表應該同樣使用 TreeNode &#xff0c;其中 right 子指針指向鏈表中下一個結點&#xff0c;而左子指針始終為 null 。展開后的單鏈表應該與二叉樹 先序遍歷 順序相同。 …

深入探討Java字符串拼接的藝術

引言 在Java編程中&#xff0c;字符串是最基本的數據類型之一。字符串拼接是開發過程中一個非常常見的操作&#xff0c;無論是構建用戶界面的文本&#xff0c;還是生成日志信息&#xff0c;都離不開字符串的拼接。然而&#xff0c;字符串拼接的效率和正確性常常被開發者忽視&a…

格式化數據恢復指南:從備份到實戰,3個技巧一網打盡

朋友們&#xff01;你們有沒有遇到過那種“啊&#xff0c;我的文件呢&#xff1f;”的尷尬時刻&#xff1f;無論是因為手滑、電腦抽風還是其他原因&#xff0c;數據丟失都可能會讓我們抓狂&#xff0c;甚至有時候&#xff0c;我們可能一不小心就把存儲設備格式化了&#xff0c;…

香橙派OrangePI AiPro測評 【運行qt,編解碼,xfreeRDP】

實物 為AI而生 打開盒子 配置 扛把子的 作為業界首款基于昇騰深度研發的AI開發板&#xff0c;Orange Pi AIpro無論在外觀上、性能上還是技術服務支持上都非常優秀。采用昇騰AI技術路線&#xff0c;集成圖形處理器&#xff0c;擁有8GB/16GB LPDDR4X&#xff0c;可以外接32…

進程通信——管道

什么是進程通信&#xff1f; 進程通信是實現進程間傳遞數據信息的機制。要實現數據信息傳遞就要進程間共享資源——內存空間。那么是哪塊內存空間呢&#xff1f;進程間是相互獨立的&#xff0c;一個進程不可能訪問其他進程的內存空間&#xff0c;那么這塊空間只能由操作系統提…

什么是RPA自動化辦公?

RPA自動化辦公&#xff1a;提升效率的利器 如今&#xff0c;自動化辦公已成為提升效率、減少錯誤、節省成本的關鍵手段。RPA&#xff08;機器人流程自動化&#xff0c;Robotic Process Automation&#xff09;作為其中的重要組成部分&#xff0c;正受到越來越多企業的青睞。那…

【全開源】簡單商城系統源碼(PC/UniAPP)

提供PC版本、UniAPP版本(高級授權)、支持多規格商品、優惠券、積分兌換、快遞鳥電子面單、支持移動端樣式、統計報表等 提供全部前后臺無加密源代碼、數據庫離線部署。 構建您的在線商店的基石 一、引言&#xff1a;為什么選擇簡單商城系統源碼&#xff1f; 在數字化時代&am…

【Spring Cloud Alibaba】初識Spring Cloud Alibaba

目錄 回顧主流的微服務框架Spring Cloud 版本簡介Spring Cloud以往的版本發布順序排列如下&#xff1a; 由停更引發的"升級慘案"哪些Netflix組件被移除了&#xff1f; 替換方案服務注冊中心&#xff1a;服務調用&#xff1a;負載均衡&#xff1a;服務降級&#xff1a…

Python—面向對象小解(6)-閉包、裝飾器

一、閉包 在Python中&#xff0c;閉包&#xff08;closure&#xff09;是一個函數對象&#xff0c;即使在其詞法作用域外被調用&#xff0c;它仍然能訪問該作用域內的變量。閉包通過“捕獲”周圍作用域的變量&#xff0c;保持這些變量的狀態&#xff0c;即使在外部函數已經返回…

干貨分享 | TSMaster 中 Hex 文件編輯器使用詳細教程

TSMaster 軟件的 Hex 文件編輯器提供了文件處理的功能&#xff0c;這一特性讓使用 TSMaster 軟件的用戶可以更便捷地對 Hex、bin、mot、s19 和 tsbinary 類型的文件進行處理。 本文重點講述 TSMaster 中 Hex 文件編輯器的使用方法&#xff0c;該編輯器能實現將現有的 Hex、bin、…

@vue-office/excel 解決移動端預覽excel文件觸發軟鍵盤

先直接上代碼 不耽誤大家時間 標明下插件庫 非常感謝作者提供預覽插件 vue-office/excel 只需要控制CSS :deep(.x-spreadsheet-overlayer) {.x-spreadsheet-selectors {display: none !important;} } :deep(.x-spreadsheet-bottombar) {li.active {user-select: none !import…

家政上門系統源碼,家政上門預約服務系統開發涉及的主要功能

家政上門預約服務系統開發是指建立一個在線平臺或應用程序&#xff0c;用于提供家政服務的預約和管理功能。該系統的目標是讓用戶能夠方便地預約各種家政服務&#xff0c;如保潔、家庭護理、月嫂、家電維修等&#xff0c;并實現服務供應商管理和訂單管理等功能。 以下是開發家政…

Windows API 速查

Windows API 函數大全 (推薦)&#xff1a;https://blog.csdn.net/xiao_yi_xiao/article/details/121604742Windows API 在線參考手冊&#xff1a;http://www.office-cn.net/t/api/index.html?web.htmWindows 開發文檔 (官方)&#xff1a;https://learn.microsoft.com/zh-cn/wi…

linux驅動學習(三)之uboot與內核編譯

需要板子一起學習的可以這里購買&#xff08;含資料&#xff09;&#xff1a;點擊跳轉 GEC6818內核源碼下載&#xff1a;點擊跳轉 一、環境配置 由于GEC6818對應是64位系統&#xff0c;虛擬機中的linux系統也要是64位&#xff0c;比如&#xff1a;ubuntu16.04.rar …