最近由于领导要求写一个手机APP,于是自学开始,不经意间想到使用过的手机APP在打开的时候都是会有一个启动页面,这是如何实现的呢?比较好奇,于是在网上搜到了以下这篇文章,经过个人实验的确可行,不过原文的某些描述并不是十分的清楚,个人也是经过了一些摸索才调试了出来,不管怎么样说这个方法还是蛮不错的,以下给出原文。

原文:

http://blog.csdn.net/shiguiyou/article/details/50255929

现在APP的启动页面(Splash Screen)好多都是等待3秒,好一点的还可以跳过,但是有的跳过也是假的按钮。当然像一些大厂的APP,像网易新闻等启动页面都是广告,人家要收广告费的。但是,对于一些普通的APP,有的也出现等待三秒的启动画面,出现一个大大的logo,好像告诉用户他打开的是什么应用,加深用户的映像,这完全是浪费用户的时间,给用户很差的体验!其实我只想快点进入APP啊!!!下面说下如何正确的打开Android启动页面。

Google的推荐

你也许很惊讶谷歌是支持开发者使用启动页面的,在[材料设计(Material Design)规范](https://www.google.com/design/spec/patterns/launch-screens.html)里面有写到(链接需要翻墙)。但是,以前google却把启动页面当反面教材来讲,看[这里](https://youtu.be/pEGWcMTxs3I?t=1434)(链接需要翻墙)。所以,该怎么办呢?

Android启动页面的正确方式

我相信google的说法不会自相矛盾的,新的建议和旧的建议都是站在一个角度来的,也就是说,最好不要浪费用户的时间去打开无用的启动页面。然而,好多应用一开始启动会花费一些时间,特别是第一次,你无法避免它,那么就可能会出现一个空白的页面,所以,既然这样,为什么不给用户一个更加友好的页面呢?这就是google的建议,不要浪费用户的时间,但是也不要给用户一个空白的页面,或者是一个还没初始化好的应用。
你会发现,最近谷歌更新的应用里面也使用了启动页面,比如,看一看YouTube的启动页面:

你看到在这个APP的启动页面所花费的时间正是APP所初始化配置自己的时间,第一次启动也是这样的,所以第一次是最慢的,但是如果有缓存了,那么每次再打开应该是立即打开了吧。

实现一个启动页面(Splash Screen)

实现一个启动页面可能和你想象的有点不一样。这个启动的页面必须是立即准备好的页面,即使是在Activity中加载一个xml页面也要是立刻加载好的。
所以,一般不会用layout来当启动页面。取而代之的是用一个颜色作为你的Activity的主题背景,接下来,在你的res/drawable文件夹下创建一个XML的drawable。

background_splash.xml  文件

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item
android:drawable="@color/gray"/> <item>
<bitmap
android:gravity="center"
android:src="@mipmap/ic_launcher"/>
</item> </layer-list>

其中,需要在 values文件夹中的 colors.xml  ,  添加以下语句。

这里,我设置了背景颜色和一张居中的图片。
然后,在主题中,将这个设置为Activity的背景。打开你的styles.xml然后为你的Activity添加一个新的主题。

<resources>

    <!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
</style> <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/background_splash</item>
</style> </resources>

在你新的SplashTheme中,设置窗口背景属性为我们之前写的XML的drawable,就是layer-list的xml。然后在你的AndroidManifest.xml中配置一下就好了。

<activity
android:name=".SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

最后,在你的SplashActivity.class文件中,编码直接进入主页面就行了。

public class SplashActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}

这里发现你并没有为Activity设置layout视图,视图来自于主题!所以,这应该是最快的方法启动页面了(相比较加载layout视图)。如果你一定要通过加载layout来显示页面,可能你初始化完了才跳出页面,这时已经有点迟了,所以,你应该考虑用极短的时间来显示加载layout视图。

不要再浪费用户的时间了!但是,当用户第一次启动等待的时候还是要展示一些友好的东西给用户而不是空白!

最后,这里是原文随便翻译的,如果有什么不对的还望指出,自己就当学习笔记记录下来。

Android启动页面的正确打开方式 (转载)的更多相关文章

  1. React-Native 之 GD (十)Android启动页面 及 模态方式跳转

    1.Android启动页面 思路:新建一个组件作为 Android 的启动页,index.android.js 的初始化窗口改为 Android启动页,设置定时器,使其在1.5秒后自动跳转到 Main ...

  2. Xcode 的正确打开方式——Debugging(转载)

    Xcode 的正确打开方式——Debugging   程序员日常开发中有大量时间都会花费在 debug 上,从事 iOS 开发不可避免地需要使用 Xcode.这篇博客就主要介绍了 Xcode 中几种能 ...

  3. C#语法——泛型的多种应用 C#语法——await与async的正确打开方式 C#线程安全使用(五) C#语法——元组类型 好好耕耘 redis和memcached的区别

    C#语法——泛型的多种应用   本篇文章主要介绍泛型的应用. 泛型是.NET Framework 2.0 版类库就已经提供的语法,主要用于提高代码的可重用性.类型安全性和效率. 泛型的定义 下面定义了 ...

  4. InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式

    InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式 https://mp.weixin.qq.com/s/HGa_90XvC22anabiBF8AbQ 在这篇文章里,我将讨论在MySQL 5 ...

  5. C++11随机数的正确打开方式

    C++11随机数的正确打开方式 在C++11之前,现有的随机数函数都存在一个问题:在利用循环多次获取随机数时,如果程序运行过快或者使用了多线程等方法,srand((unsigned)time(null ...

  6. 【分享】WeX5的正确打开方式(6)——数据组件初探

    本文是[WeX5的正确打开方式]系列的第6篇文章,简单介绍一下WeX5中数据组件的特性和结构形式. 数据组件的由来 上一篇 WeX5绑定机制我们实现了一个简单的记账本应用,当时所有数据都用 JSON ...

  7. (一)Redis for Windows正确打开方式

    目录 (一)Redis for Windows正确打开方式 (二)Redis for 阿里云公网连接 (三)Redis for StackExchange.Redis 下载地址 官网.中文网1 及 中 ...

  8. List的remove()方法的三种正确打开方式

    转: java编程:List的remove()方法的三种正确打开方式! 2018年08月12日 16:26:13 Aries9986 阅读数 2728更多 分类专栏: leetcode刷题   版权声 ...

  9. Pull Request的正确打开方式(如何在GitHub上贡献开源项目)

    Pull Request的正确打开方式(如何在GitHub上贡献开源项目) GitHub的官方帮助如下: Fork A Repo: https://help.github.com/articles/f ...

随机推荐

  1. python基础:数据类型阶段总结

    name =“   alex”1.移除name变量对应的值两边的空格,并输出处理结果      res=name.strip(’  ‘)      print(res) 2.判断neme变量对应的值是 ...

  2. AtCoder Beginner Contest 132 F Small Products

    Small Products 思路: 整除分块+dp 打表发现,按整除分块后转移方向如下图所示,上面的块的前缀转移到下面的块 代码: #pragma GCC optimize(2) #pragma G ...

  3. SSH环境搭建之Spring环境搭建篇

    SSH环境搭建之Spring环境搭建篇 一.引入Spring所使用的JAR文件 二.在src目录下创建beans.xml(Spring的容器文件) <?xml version="1.0 ...

  4. 一个线程相关的高CPU占用问题的定位

    最近在重构项目代码时,发现两个线程同时访问一个加锁的std::list队列时,会出现恶性竞争锁的现象. 具体现象是A线程总是拿不到锁,B线程抢占几次后,A才抢占到. 由于是重构项目,也无法通过回滚代码 ...

  5. Webpack v4.8.3 快速入门指南

    一.进入 https://webpack.docschina.org/ 官方文档,点击 "文档" 进入 文档页面,文档中包含  “概念,配置,API,指南,LOADERS,插件&q ...

  6. MyBatis-05-解决属性名和字段名不一致的问题

    5.解决属性名和字段名不一致的问题 1.问题 数据库中的字段 新建一个项目,拷贝之前的,测试实体类字段不一致的情况. public class User { private int id; priva ...

  7. CodeForces - 113B Petr# (后缀数组)

    应该算是远古时期的一道题了吧,不过感觉挺经典的. 题意是给出三一个字符串s,a,b,求以a开头b结尾的本质不同的字符串数. 由于n不算大,用hash就可以搞,不过这道题是存在复杂度$O(nlogn)$ ...

  8. C# LINQ(10)

    LINQ 查询 var query = from r in Formula1.GetChampions() where r.Country == "Brazil" orderby ...

  9. hdfs冷热数据分层存储

    hdfs如何让某些数据查询快,某些数据查询慢? hdfs冷热数据分层存储 本质: 不同路径制定不同的存储策略. hdfs存储策略 hdfs的存储策略 依赖于底层的存储介质. hdfs支持的存储介质: ...

  10. Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) A. CME

    链接: https://codeforces.com/contest/1241/problem/A 题意: Let's denote correct match equation (we will d ...