Android 应用的欢迎界面实现代码
本文详细描述了如何实现如下图中的微信启动界面. 该类启动界面的特点是在整个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.
希望本篇文章能帮助开发android应用的朋友。