当前位置: 移动技术网 > IT编程>移动开发>Android > Android启动页解决方案(推荐)

Android启动页解决方案(推荐)

2019年07月24日  | 移动技术网IT编程  | 我要评论

601875,逃出游客旅馆攻略,杨白冰简历

启动页几乎成为了每个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启动页解决方案,希望对大家有所帮助

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网