一款app刚出世的时候是没有广告的,流畅的速度和粘性的设计,让这款app使用的人越来越多,这个时候,广告就诞生了,app中加入广告的位置有很多,最常见的就是启动页的广告,首页的banner的轮询广告,其他页面的一些角标广告。今天我这里实现的是一个Android的启动页的广告,支持倒计时,和跳过,点击进入广告的详情页。今天记录下来,也给大家参考。
首先来看效果图:
我们都知道现在大多app启动的时候,都有一个loading的activity,就比如今日头条,高德地图那样的,如下图,在这我们叫它StartLoadingActivity,一般会在这个界面停留1秒中的时间,我们会在这里做一些全局的初始化的操作,或者是一些全局的广播的注册等等。
我的思路:
1、在StartLoadingActivity中去后台检查,有没有广告的配置
2、如果没有,1s后直接进入主页,如果有,就去下载广告图片,并存储广告的其他信息
3、app下次打开的时候,去检查本地缓存,和数据库,如果有广告的信息,并且没有过期,就显示广告。
这儿有个问题,就是先检查本地缓存还是先去后台检查有没有广告的配置,我个人的做法是先去检查本地是否有广告的缓存,这样保证最新配置的广告在下次app启动的时候显示。
下面来说说具体的实现:
广告的实体类中主要有以下字段:
<span style="white-space:pre"> </span>private String androidimg;//广告图片的url
private String end;// 过期时间的时间戳
private String id;
private String rank;//广告的排序
private String shorturl;
private String title;//广告的标题
/**
* 广告类型 1:文字 2:图片 3:图文
*/
private String typeid;
private String url;//点击广告跳转的url
private String flag;//0:广告可点击 1:广告不可点 2:app端删除这条广告的信息(数据库/图片缓存)
StartLoadingActivity类的xml文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/iv_welcome_img"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/tt"
android:scaleType="fitXY" />
<RelativeLayout
android:id="@+id/rl_show_ad"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"
>
<ImageView
android:id="@+id/iv_ad_img"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="40dp"
android:layout_marginBottom="30dp"
android:paddingLeft="7dp"
android:paddingRight="7dp"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:orientation="horizontal"
android:background="@drawable/bg_ad_skip" >
<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="19sp"
android:textColor="#ffffffff"
/>
<Button
android:id="@+id/ll_ad_skip_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@null"
android:layout_marginLeft="3dp"
android:textColor="#ffffffff"
android:text="跳过 "
android:textSize="19sp"
/>
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
然后在 StartLoadingActivity类中,去查询数据库和本地缓存,有没有广告的信息,如果有的话,就取本地缓存的图片装换成bitmap,然后加载到imageview中,
alist = AdvertisementDao.getAdDataList();//查询广告信息
if(alist != null && alist.size()>0){
mAdver = alist.get(alist.size()-1);
File f =new File(mAdver.getAndroidimg());//获取最新的一条广告信息
if(f.exists() && !isDeadline(alist.get(alist.size()-1))){//判断文件存在,并且没有过期
Bitmap b = AdvertiseUtil.scaleImgSize(f);
adImg.setImageBitmap(b);
adIsFinish = true;
b = null;
}
}
现在只需要在加载界面去判断,如果adIsFinish为true,就把adImg显示出来。点界面的跳过,就提前结束倒计时,跳转到主界面即可。
那么问题又来了,如果时间长了,我们的数据库中和本地文件的缓存中肯定有很多的数据,这样肯定不好,这儿我用一个线程去检查数据库中所有的数据,然后看他们的end是否过期,如果过期就把这条数据和它对应的本地文件删了。这样就不会有数据冗余的情况了。
// 启动一个线程,去删除过期的广告信息
new Thread(new Runnable() {
@Override
public void run() {
for (Ad ad : alist) {
if (isDeadline(ad)) {
// 如果当前广告过期,则删除数据库中的记录,和本地的文件
AdvertiseUtil.deleteCachedAdverImg(context, ad);
AdvertisementDao.deleteAd(ad);
}
}
}
}).start();
}
到此,一个简单的启动页广告就ok了,当然,如果用到实际项目中的话,还需要大家继续优化。