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

Android 应用的欢迎界面实现代码

程序员文章站 2024-03-05 09:17:54
本文详细描述了如何实现如下图中的微信启动界面. 该类启动界面的特点是在整个application的生命周期里, 它只会出现在第一次进入应用时, 即便按回退键到桌面之后. 使...

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

Android 应用的欢迎界面实现代码

知识要点:

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.

希望本篇文章能帮助开发android应用的朋友。