欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-10-09 11:41:11
启动页几乎成为了每个app的标配,有些商家在启动页中增加了开屏广告以此带来更多的收入。目前启动页的广告都有倒计时的功能,那么我们在倒计时的过程中能做些什么呢? 这篇文章主...

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

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

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

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

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

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

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

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启动页解决方案,希望对大家有所帮助