Android启动页解决方案(推荐)
启动页几乎成为了每个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,欢迎访问
以上所述是小编给大家介绍的android启动页解决方案,希望对大家有所帮助
上一篇: 三星神舟华硕最热门轻薄笔记本推荐
下一篇: 神舟战神2899挑战游戏本底线