本文详细描述了如何实现如下图中的微信启动界面. 该类启动界面的特点是在整个Application的生命周期里, 它只会出现在第一次进入应用时, 即便按回退键到桌面之后. 使用该类启动界面的应用还有: QQ, QQ音乐, 网易云音乐和微博等等.

知识要点:

  • AndroidManifest.xml 中 activity 的 android:noHistory 属性, 即 Intent.FLAG_ACTIVITY_NO_HISTORY
  • 隐式Intent
  • 回退栈(BackStack)

  详细内容见官方文档.

实现代码:

> 定义

  • SplashActivity 为启动界面
  • MainActivity 为主界面

> AndroidManifest.xml

<!-- 该文件为AndroidManifest.xml, 以下代码为application下的activity声明 -->

<!-- 启动界面 -->
<activity android:name=".SplashActivity"
android:label="@string/app_name"
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity> <!-- 主界面 -->
<activity android:name=".MainActivity" android:label="@string/app_name">
</activity>

特别需要注意的是, 在上述Activity-XML定义中, 我们设置了SplashActivity为noHistory的属性为true, 该设置是告诉系统只要离开该activity, 则请把该activity从回退栈中清除. 另外, 直接在Intent中设置Intent.FLAG_ACTIVITY_NO_HISTORY标识的效果同设置该属性为true的.

> SplashActivity.java

import ...

public abstract class SplashActivity extends Activity implements Runnable {
final Handler mHandler = new Handler(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash); mHandler.postDelayed(this, 2000);
} @Override
public void run() {
Intent intent = new Intent(this, MainActivtiy.class);
startActivity(intent);
// 此处可以不需要调用finish()了, 因为已经设置了noHistory属性, 从而使得系统接管finish操作
}
}

> MainActivity.java

import ...

public abstract class MainActivity extends Activity {
... @Override
public void onBackPressed() {     
    // 方法 1: goto the default launcher. It's not recommended.
    // Intent i = new Intent(Intent.ACTION_MAIN);
    // i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    // i.addCategory(Intent.CATEGORY_HOME);
    // startActivity(i);     // 方法 2: goto the default launcher. It's recommended.
    moveTaskToBack(true);
  }
}

上述代码中, 提供了两个方法, 第一个方法通过隐式Intent来切换到桌面应用(即Launcher), 第二个方法则是将当前activity所在的task切换到后台, 需要注意的是, moveTaskToBack(boolean nonRoot) 的 nonRoot 参数, 如果nonRoot=false, 则要求当前activity为栈顶activity, 否则, 调用将不起任何效果, 如果nonRoot=true, 则忽略nonRoot=false时的条件, 因此, 我们在这里直接设置nonRoot=true

到这里, 我们可以一直按回退键, 直到切换到桌面, 这时SplashActivity已经被系统清理了, MainActivity连同它所在的Task已经切换到后台了. 下次我们再启动应用时, 只要MainActivity没有被系统回收, 那么我们再看到的MainActivity还是退回到桌面前的那个MainActivity.

END.

Android开发案例 - 欢迎界面的更多相关文章

  1. AllJoyn+Android开发案例-android跨设备调用方法

    AllJoyn+Android开发案例-android跨设备调用方法 项目须要涉及AllJoyn开源物联网框架.前面主要了解了一些AllJoyn主要的概念.像总线,总线附件,总线对象,总线接口这种概念 ...

  2. 【Android开发-5】界面装修,五大布局你选谁

    前言:假设要开一家店,门店装修是非常重要的事情.有钱都请专门的建筑设计公司来设计装修,没钱的仅仅能自己瞎折腾.好不好看全凭自己的感觉.像Android开发.在移动端大家看到的界面视觉不咋滴,一般连打开 ...

  3. Android开发案例 - 图库

    本文不涉及UI方面的内容, 如果您是希望了解UI方面的访客, 请跳过此文. 本文将要详细介绍如何实现流畅加载本地图库. 像平时用得比较多应用, 如微信(见下图), 微博等应用, 都实现了图库功能, 其 ...

  4. [Deprecated!] Android开发案例 - 微博正文

    Deprecated! 更好的实现方式: 使用 android.support.design.widget.CoordinatorLayout. 本文详细介绍如何实现如下图中的微博正文页面效果, 其中 ...

  5. android开发中在界面上实现曲线图的几个开源项目

    转自:https://wapiknow.baidu.com/question/1959128379041474620?qq-pf-to=pcqq.c2c 几个相关开源项目: 1.  MPAndroid ...

  6. Android开发之欢迎界面标准

    import java.util.ArrayList; import android.app.Activity; import android.content.SharedPreferences; i ...

  7. 【Android开发】交互界面布局详解

    原文:http://android.eoe.cn/topic/summary Android 的系统 UI 为构建您自己的应用提供了基础的框架.主要包括主屏幕 (Home Screen).系统 UI ...

  8. Android开发案例 设置背景图片轮播

    点击按钮实现图片轮播效果 实践案例: xml <?xml version="1.0" encoding="utf-8"?> <LinearLa ...

  9. Android开发案例 – 在AbsListView中使用倒计时

    在App中, 有多种多样的倒计时需求, 比如: 在单View上, 使用倒计时, 如(如图-1) 在ListView(或者GridView)的ItemView上, 使用倒计时(如图-2) 图-1 图-2 ...

随机推荐

  1. 那些年黑了你的微软BUG

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 前言 炎炎夏日,朗朗乾坤,30℃ 的北京,你还在 Coding 吗? 整个 7 月都在忙项目,还加了 ...

  2. ABP框架 - 功能管理

    文档目录 本节内容: 简介 关于 IFeatureValueStore 功能类型 Boolean 功能 Value 功能 定义功能 基本功能属性 其它功能属性 功能层次 检查功能 使用Requires ...

  3. maven repo plugin archiver

    Failure to transfer org.apache.maven:maven-archiver:pom:2.4.1 from http://repo1.maven.org/xxx was ca ...

  4. Integer.parseInt 引发的血案

    Integer.parseInt 处理一个空字符串, 结果出错了, 程序没有注意到,搞了很久, 引发了血案啊!! 最后,终于 观察到了, 最后的部分: Caused by: java.lang.NoC ...

  5. MailKit系列之---查询SearchQuery

    对于邮件的唯一Id查询,由于MailKit提供了大量的方法,无法完全讲解完全,所以这里只选择几个来介绍. MailKit通过方法folder.Search来查询邮件的唯一Id,参数是一个SearchQ ...

  6. sqlalchemy学习

    sqlalchemy官网API参考 原文作为一个Pythoner,不会SQLAlchemy都不好意思跟同行打招呼! #作者:笑虎 #链接:https://zhuanlan.zhihu.com/p/23 ...

  7. 【Win 10应用开发】把文件嵌入到XML文档

    把文件内容嵌入(或存入)到XML文档中,相信很多朋友会想到把字节数组转化为Base64字符串,再作为XML文档的节点.不过,有人会说了,转化后的base64字符串中含有像“+”这样的符号,写入到XML ...

  8. [3D数学基础:图形与游戏开发]专栏前言

    期待的书终于到了,接下来我会把自己的学习笔记以及心得整理出来,形成专栏,每一章都进行记录和学习总结,今天是2016年12月30日,再过一天就是元旦了,就要迎来美好的2017年了!!!加油~ 上面的书就 ...

  9. Oracle RAC 更换存储实验

    实验环境准备: RHEL 6.5 + Oracle 11.2.0.4 RAC (2nodes) OCR和Voting Disk使用的是OCR1磁盘组,底层对应3个1G大小的共享LUN,一般冗余: DA ...

  10. heart

    好久没写博客了,不想废话,直接欣赏效果! 点击这里,查看完美效果! 附完整代码: <!doctype html> <html> <head> <meta ch ...