到现在为止好的开屏广告对一个APP是非常重要的,不仅可以吸引更多的用户而且可以通过广告盈利。今天就让我来介绍一下我实现开屏广告的思路以及实现方案吧~
1. 开屏广告思路
1.1 APP启动白屏页
我们都知道可以在 manifest 文件中设置启动页面,但当我们打开APP时仍有短暂的黑屏(白屏),在一些较老的手机中这一现象更加明显,这一现象可以通过设置 APP 的 them 的 style 文件来解决。
进入到 AndroidManifest 文件,找到启动页的 them(主题)设置为启动页的背景图:
<!-- 启动页 -->
<activity
android:name=".activity.WelcomeActivity"
android:screenOrientation="portrait"
android:theme="@style/WelcomeActivityTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
---------- 以下为 style 文件 -----------
<style name="WelcomeActivityTheme" parent="AppDefaultTheme">
//设置属性为启动页背景图,避免打开时一闪而过的白色背景
<item name="android:windowBackground">@drawable/welcome_page</item>
</style>
1.2 APP启动页
解决完开屏白屏后就进到了设置的启动页面,也就是启动页,通常是APP的 Logo 图,因此这一步设置的图片资源应该和上一步设置的白屏页资源文件一致,启动页通常会延时 1~3S 进入广告页。因为这个页面有延时的操作,因此可以利用这个时间来做一些项目的初始化操作,而不是全部放在 Appliaction 文件中,造成 Appliaction 文件过重。同时可以利用这段时间来做要开屏广告的预加载,先把要加载的媒体文件下载下来,一方面可以减少流量的消耗,另一方面可以提高加载速率,增强用户体验。我这里使用了 IntentService 来实现这一方案。
打开启动页的同时启动 IntentService 服务,在服务中请求广告接口,成功后再对返回的媒体文件 URL 下载缓存下来,我这里采用的是 Glide 的预加载 API。如果第一次打开启动页时,在2S内无法加载完成,则会在 后台(IntentService) 继续下载缓存到本地,同时跳转到首页。当下一次启动时检测到有图片时则进入到广告页展示。
//图片是否加载完成
public static boolean IS_DOWNLOAD = false;
//广告页数据
public static LaunchAdEntity sLaunchAdEntity;
/**
* 预加载图片
*/
private void preload(String url) {
Glide.with(getApplicationContext())
.load(url)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
//下载图片失败
return true;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
//下载图片成功
IS_DOWNLOAD = true;
return true;
}
}).preload();
}
我们在 IntentService 里请求接口,进行图片预加载,那就存在一个问题,跳转到 Activity 时,在下一个界面(APP广告页)如何获取到 IntentService 里的数据呢?
我这里用了一个小技巧:通过两个全局静态变量来接收,从而绕过了组件通信的问题
1.3 APP广告页
所谓的广告页指的就是金主爸爸让我们展示的页面,展示的媒介我们要尽可能的考虑全面包括 图片、视频、GIF 等等。对于多种媒介来说我们可以采用设计模式来实现而不是一味地采用的 if----else----。
除此之外,我们还可以做个思考,现在只是单一页面的广告,如果是多广告时如何处理,对于多屏广告时的曝光埋点,又该如何处理?
同时,对于页面上的按钮也可以做成后端配置处理,根据服务端返回进行设置,做相应的处理,而这一系列的操作都可以通过优秀的设计模式进行处理。
1.4 广告跳转页
指的是在展示广告时点击展示广告时跳转的页面,在这个地方可以参考上一步 1.3 的方案,同样采用优秀的设计模式进行设计,提高项目的拓展性。
1.5 首页
指的是在 展示完广告页 或 跳过广告页 或 从广告跳转页返回 的界面。前两个条件实现起来不是很难,这里要注意的是 第 3 个条件?在 1.4 里提到过进入 广告页跳转页 的页面有多个,可以理解为有多个不同的 Activity(有可能是业务界面,有可能是WebView展示界面)我统称它们为 广告页跳转页。如何在这些页面按返回时返回到 首页 呢?
对于这个问题我的处理方案是,先去 StartActivity 到 MainActivity (首页)然后再 StartActivity 到AdvertiseActivity(广告页)。这其实就是将首页快速压入栈然后再跳到广告页的一个思路。
本篇文章主要提供一个开屏广告的思路,以及一些优化方案的思考,其中的一些细节,仍然可以再研究透彻一些,欢迎指正~