Android 开屏广告

上一篇说了 ios 的开屏广告,这次把 Android 的也发下。逻辑,界面和 ios一致。

需求:广告不是一成不变,要随时更换图片,上下架时间,以及要启动就展示,需要先存到本地,以及点击跳转等问题。

服务端返回的数据格式

adver =     (
                {
            endtime = 1516622424;
            id = 7;
            link = "https://www.baidu.com";
            pic = "/uploads/image/18/01/5a65608db3ebb.png";
        }
    );
if (data.has("adver") && data.getJSONArray("adver").length() != 0) {
                    //有广告字段
                    JSONObject adJsonObj = data.getJSONArray("adver").getJSONObject(0);
                    Long endtime = adJsonObj.optLong("endtime") * 1000;
                    String pic = adJsonObj.getString("pic");
                    String link = adJsonObj.optString("link");
                    String str_endtime = endtime + "";

                    //数据有效性判断
                    if (StringUtils.isEmpty(str_endtime) || StringUtils.isEmpty(pic)) {
                        return;
                    }
                    if (hasAd()) {
                        //本地有图片
                        if (adChanged(pic, str_endtime, link)) {
                            //是新的图片
                            SaveAdImage(str_endtime, pic, link);
                        } else {
                            //do nothing
                        }
                    } else {
                        //本地没图片
                        SaveAdImage(str_endtime, pic, link);
                    }


                } else {
                    removeAd();
                    //没有广告字段
                }
    private void SaveAdImage(final String end_time, final String _url, final String link)
    {

        if (isAdPicDownloading) {
            return;
        }
        isAdPicDownloading = true;
        Handler handler = new Handler(Looper.getMainLooper());

//        final String path = (AppContext.getAppContext().getExternalCacheDir() != null ? AppContext.getAppContext().getExternalCacheDir() : AppContext.getAppContext().getCacheDir()) + "/" + _url.substring(_url.lastIndexOf("/") + 1);
        final String path = FileUtils.getSDCardPath() + "/" + AppContext.getAppContext().getPackageName() + "/" + _url.substring(_url.lastIndexOf("/") + 1);
        //如果有上次下载失败有临时文件需要删除之后才能正常下载
        if (new File(path).exists()) {
            PreferenceHelper.write(AppContext.getAppContext(), AppConfig.APP_START, DATA_AD_ENDTIME, end_time);
            PreferenceHelper.write(AppContext.getAppContext(), AppConfig.APP_START, DATA_AD_LINK, link);
            PreferenceHelper.write(AppContext.getAppContext(), AppConfig.APP_START, DATA_AD_PIC, path);
            return;
        }
        handler.post(new Runnable()
        {
            @Override
            public void run()
            {
                mKjh.download(path,
                        URLs.makeOriginImageUrl(_url), new HttpCallBack()
                        {

                            @Override
                            public void onFailure(int errorNo, String strMsg)
                            {
                                super.onFailure(errorNo, strMsg);
                            }

                            @Override
                            public void onFinish()
                            {
                                isAdPicDownloading = false;
                                super.onFinish();
                            }

                            @Override
                            public void onSuccess(byte[] t)
                            {

                                super.onSuccess(t);
                                PreferenceHelper.write(AppContext.getAppContext(), AppConfig.APP_START, DATA_AD_ENDTIME, end_time);
                                PreferenceHelper.write(AppContext.getAppContext(), AppConfig.APP_START, DATA_AD_LINK, link);
                                if (!path.equals(PreferenceHelper.readString(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_PIC))) {
                                    removeOldAdFile();
                                    PreferenceHelper.write(AppContext.getAppContext(), AppConfig.APP_START, DATA_AD_PIC, path);
                                }
                            }
                        });
            }
        });

    }

private void removeOldAdFile()
    {
        String oldPath = PreferenceHelper.readString(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_PIC);
        if (!StringUtils.isEmpty(oldPath)) {
            File oldFile = new File(oldPath);
            if (oldFile.exists()) {
                oldFile.delete();
            }
        }
    }

activity_start.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:orientation="vertical">

    <ImageView
        android:id="@+id/iv_ad_app_start"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/darker_gray"
        android:scaleType="centerCrop"
        android:visibility="gone"></ImageView>

    <LinearLayout
        android:id="@+id/ll_ad_jump"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_gravity="right"
        android:layout_marginRight="@dimen/space_15"
        android:layout_marginTop="@dimen/space_15"
        android:background="@drawable/btn_ad_jump"
        android:gravity="center"
        android:visibility="gone">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="@dimen/space_10"
            android:layout_marginRight="@dimen/space_2"
            android:text="跳过"
            android:textColor="@color/white"
            android:textSize="@dimen/font_size_15"/>

        <TextView
            android:id="@+id/tv_count_down"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="@dimen/space_2"
            android:layout_marginRight="@dimen/space_10"
            android:text="3"
            android:textColor="#ff9900"
            android:textSize="@dimen/font_size_15"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/ll_default_app_start"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/screen_bg"
        android:orientation="vertical"
        android:visibility="gone">

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:gravity="bottom|center">

            <ImageView
                android:id="@+id/img_start"
                android:layout_width="188dp"
                android:layout_height="61dp"
                android:layout_marginBottom="@dimen/space_30"
                android:scaleType="fitXY"
                android:src="@drawable/screen"/>
        </LinearLayout>


        <TextView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_gravity="bottom"
            android:layout_marginBottom="@dimen/space_10"
            android:layout_weight="1"
            android:gravity="bottom|center"
            android:text="@string/at365"
            android:textColor="@color/screen_text_color"
            android:textSize="@dimen/font_size_12"/>
    </LinearLayout>


</FrameLayout>
    @BindView(id = R.id.iv_ad_app_start)
    ImageView ivAdAppStart;
    @BindView(id = R.id.ll_default_app_start)
    LinearLayout llDefaultAppStart;
    @BindView(id = R.id.tv_count_down)
    TextView tvCountDown;
    @BindView(id = R.id.ll_ad_jump)
    LinearLayout llAdJump;
    @BindView(id = R.id.img_start)
    private ImageView mImageView;
    private void showAdAppStartView()
    {
        llDefaultAppStart.setVisibility(View.GONE);
        final String path = PreferenceHelper.readString(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_PIC);
        final String link = PreferenceHelper.readString(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_LINK);
        AppContext.getAppContext().getKjBitmap().display(ivAdAppStart, path, DensityUtils.getScreenW(AppContext.getAppContext()), DensityUtils.getScreenH(AppContext.getAppContext()), null, null,
                new BitmapCallBack()
                {
                    @Override
                    public void onSuccess(Bitmap bitmap)
                    {
                        ivAdAppStart.setVisibility(View.VISIBLE);
                        llAdJump.setVisibility(View.VISIBLE);
                        final CountDownTimer countDownTimer = new CountDownTimer(3200, 1000)
                        {
                            @Override
                            public void onTick(long millisUntilFinished)
                            {
                                tvCountDown.setText((millisUntilFinished) / 1000 + "");

                            }

                            @Override
                            public void onFinish()
                            {
                                tvCountDown.setText("0");
                                redirectTo();
                            }
                        }.start();


                        llAdJump.setOnClickListener(new View.OnClickListener()
                        {
                            @Override
                            public void onClick(View v)
                            {
                                countDownTimer.cancel();
                                redirectTo();
                            }
                        });
                        ivAdAppStart.setOnClickListener(new View.OnClickListener()
                        {
                            @Override
                            public void onClick(View v)
                            {
                                if (!StringUtils.isEmpty(link)) {
                                    countDownTimer.cancel();
                                    browserPath = link;
                                    curMode = luchModeBrowser;
                                    redirectTo();
                                }
                            }
                        });
                        super.onFinish();
                        super.onSuccess(bitmap);
                    }

                    @Override
                    public void onFailure(Exception e)
                    {

                        removeAd();
                        startDefaultAppStartView();
                        super.onFailure(e);
                    }

                    @Override
                    public void onFinish()
                    {


                    }
                });
//        timer.schedule(new TimerTask() {
//            @Override
//            public void run() {
////
//            }
//        }, 3 * 1000, 1000);


    }

    private void removeAd()
    {
        File file = new File(PreferenceHelper.readString(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_PIC));
        if (file.exists()) {
            file.delete();
        }
        PreferenceHelper.write(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_ENDTIME, "");
        PreferenceHelper.write(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_PIC, "");

    }

    private void startDefaultAppStartView()
    {
        ivAdAppStart.setVisibility(View.GONE);
        llDefaultAppStart.setVisibility(View.VISIBLE);
        Animation animation = AnimationUtils.loadAnimation(this,
                R.anim.splash_start);
        // 监听动画过程
        animation.setAnimationListener(new AnimationListener()
        {
            @Override
            public void onAnimationStart(Animation animation)
            {
            }

            @Override
            public void onAnimationRepeat(Animation animation)
            {
            }

            @Override
            public void onAnimationEnd(Animation animation)
            {
                redirectTo();
            }
        });
        mImageView.setAnimation(animation);
    }

    private boolean hasAd()
    {
        return !StringUtils.isEmpty(PreferenceHelper.readString(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_ENDTIME)) && !StringUtils.isEmpty(PreferenceHelper.readString(AppContext.getAppContext(), AppConfig.APP_START, UpdateCommonUnitedTask.DATA_AD_PIC));
    }

这段 android 是我之前同事写的,个人感觉写的烂透了,时间容许我会给重构成 demo。先这样吧。。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,382评论 25 707
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,392评论 2 45
  • 6月2日咖啡冥想 1、一早叫女儿起床,女儿说肚子疼,随后就兴奋的说自己例假来了,终于赶在高考前来,一家人欢欢喜喜,...
  • 一个自私自利的人,永远只是遭人唾弃。 一个自私自利的人,永远不会有朋友。 一个永远只顾自己,而不顾他人的人,永远不...
    f9f1de48dc41阅读 84评论 0 0