Android启动页解决方案

转载请注明出处:http://www.jianshu.com/p/2666fbf9f175

启动页几乎成为了每个app的标配,有些商家在启动页中增加了开屏广告以此带来更多的收入。目前启动页的广告都有倒计时的功能,那么我们在倒计时的过程中能做些什么呢?

这篇文章主要包括以下两方面内容

  • 集成腾讯广告联盟的SDK
  • 启动页加载过程中,后台初始化数据

我们在设计启动页时的常规做法是建立一个Activity来加载开屏图片或者广告,作为程序的入口,那么在这个三到五秒时间内如果进行数据下载,当用户点击了跳过按钮或者计时结束了数据还没初始化完成,已经进入了主页面,而主界面刚好需要那些基础数据该如何?

随机广告与移动无关

因此,我们将启动页和主界面设计成两个Fragment,集成到MainActivity中。这样我们在启动页中加载广告,在主界面中下载数据,登陆等耗时操作,程序的结构如下:

结构

01 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.landptf.blog.MainActivity">

    <fragment
        android:id="@+id/fm_splash"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.landptf.blog.splash.SplashFragment" />

    <fragment
        android:id="@+id/fm_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.landptf.blog.MainFragment" />

</FrameLayout>

包含了两个fragment,分别是加载广告也和主界面的

02 MainActivity.java

/**
 * Created by landptf on 2017/03/18.
 * 主页面,包含了SplashFragment和MainFragment
 */
public class MainActivity extends AppCompatActivity {

    private FragmentManager frManager;
    private SplashFragment fmSplash;
    private MainFragment fmMain;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        frManager = getSupportFragmentManager();
        fmSplash = (SplashFragment) frManager.findFragmentById(R.id.fm_splash);
        fmMain = (MainFragment) frManager.findFragmentById(R.id.fm_main);
        showSplash();
    }

    private void showSplash(){
        frManager.beginTransaction().hide(fmMain).show(fmSplash).commit();
    }

    public void dismissSplash(){
        frManager.beginTransaction().hide(fmSplash).show(fmMain).commitAllowingStateLoss();
    }
}

在SplashFragment中广告加载完成或者点击跳过后调用dismissSplash将SplashFragment隐藏,将MainFragment显示出来

03 SplashFragment.java

/**
 * Created by landptf on 2017/03/18.
 * 启动页,集成了腾讯广告联盟的开屏广告
 */
public class SplashFragment extends Fragment {
    private static final String TAG = SplashFragment.class.getSimpleName();

    private MainActivity activity;

    private ViewGroup container;
    private TextView tvSkip;
    private ImageView ivSplashHolder;
    private static final String SKIP_TEXT = "点击跳过 %d";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_splash, container, false);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        activity = (MainActivity) getActivity();
        initView();
    }

    private void initView() {
        container = (ViewGroup) activity.findViewById(R.id.fl_splash_container);
        tvSkip = (TextView) activity.findViewById(R.id.tv_skip);
        ivSplashHolder = (ImageView) activity.findViewById(R.id.iv_splash_holder);
        //申请动态权限
        ApplyPermissions();
    }

    /**
     * 动态申请集成腾讯广告联盟的开屏广告所需要的三个权限
     * 使用了RxPermissions开源框架
     */
    private void ApplyPermissions() {
        RxPermissions rxPermissions = new RxPermissions(activity);
        rxPermissions
                .request(Manifest.permission.READ_PHONE_STATE,
                        Manifest.permission.ACCESS_COARSE_LOCATION,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .subscribe(granted -> {
                    if (granted) {
                        //获取开屏广告
                        new SplashAD(activity, container, tvSkip, Constants.APPID, Constants.SplashPosID, adListener, 5000);
                    } else {
                        //直接进入主页面
                        activity.dismissSplash();
                    }
                });

    }

    /**
     * 开屏广告状态的监听
     */
    private SplashADListener adListener = new SplashADListener() {

        /**
         * 广告关闭时调用,可能是用户关闭或者展示时间到。此时一般需要跳过开屏的Activity,进入应用内容页面
         */
        @Override
        public void onADDismissed() {
            activity.dismissSplash();
        }

        /**
         * 广告加载失败,errCode用于描述失败原因。
         * @param i
         */
        @Override
        public void onNoAD(int i) {
            Log.e(TAG, "error code = " + i);
            activity.dismissSplash();
        }

        /**
         * 广告成功展示时调用
         */
        @Override
        public void onADPresent() {
            ivSplashHolder.setVisibility(View.GONE);
        }

        /**
         * 广告被点击时调用
         */
        @Override
        public void onADClicked() {
            Log.i(TAG, "SplashADClicked");
        }

        /**
         * 倒计时回调,返回广告还将被展示的剩余时间,单位是ms
         * @param l
         */
        @Override
        public void onADTick(long l) {
            tvSkip.setText(String.format(SKIP_TEXT, Math.round(l / 1000f)));
        }
    };
}

这里集成了腾讯广告联盟,点击这里注册,流程比较简单,按照说明一步一步进行就可以了,sdk文档也比较详细。

当广告加载完成后调用 activity.dismissSplash();将其隐藏

04 MainFragment.java

/**
 * 模拟后台耗时操作
 */
private void testThread(){
    new Thread(() -> {
        int i = 0;
        while (i < 5) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Log.e(TAG, "--- " + i + " ---");
            i++;
        }
    }).start();
}

在MainFragment主线程中开启了一个只线程来模拟耗时操作,通过log可以看到在广告倒计时的过程中线程已经在执行了。

03-18 03:30:50.348 9491-9513/com.landptf.blog E/MainFragment: --- 0 ---
03-18 03:30:51.348 9491-9513/com.landptf.blog E/MainFragment: --- 1 ---
03-18 03:30:52.348 9491-9513/com.landptf.blog E/MainFragment: --- 2 ---
03-18 03:30:53.349 9491-9513/com.landptf.blog E/MainFragment: --- 3 ---
03-18 03:30:54.350 9491-9513/com.landptf.blog E/MainFragment: --- 4 ---

以上就是app的启动页方案,充分利用了加载广告的时间

全部代码已上传至Github,欢迎访问

end.

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,594评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,108评论 18 139
  • 下载源码git clone https://github.com/vim/vim.git 检查配置sudo ./c...
    在路上_W阅读 688评论 0 0
  • L:我已经疯狂,谢谢你成就了我的疯狂 H:怎么感谢我 L:继续疯狂 H:怎么继续感谢我 L:一直疯狂下去,疯狂到底...
    Looloo阅读 108评论 0 1
  • 一旦开启慵懒姿势,要回归原有的做事动态——灰熊难!昨天已经让自己放空了一天,我选择用老方式来cheer up:重看...
    我是苏二苏阅读 583评论 5 10