启动页是APP呈现给用户的第一个页面,在安卓中,启动页需要在AndroidManifest.xml中配置 intent-filter

1
2
3
4
5
6
7
8
<activity
android:name=".SplashActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

在开发启动页过程中,会遇到两个问题,需要注意。

启动页白屏

原因

在启动APP时,系统会开启新的进程,这个操作是需要时间的,在启动页内容加载成功前,有一个默认的白色背景,导致了白屏。

解决方案

将注意力集中在白屏上,我们可以改变默认显示的界面,就解决了问题。这里有多种方案:

界面没有UI交互的情况

  1. 移除setContentView(),将界面写进layer-list
  2. 将改layer-list配置为SplashActivity主题的android:windowBackground属性。

界面有UI交互的情况

不处理setContentView(),将android:windowBackground设置为透明色。这种做法是把锅甩给了手机系统(看,你的手机卡了,不关我事)。

启动页重复开启

现象:

首次安装APP之后启动,打开页面,随后退后台,再开启APP,activity栈里会有两个启动页。

原因

这个问题由来已久,是安卓系统的历史遗留且长期存在的bug,
相关issue:
https://issuetracker.google.com/issues/36907463
https://issuetracker.google.com/issues/36941942

解决方案

在启动是判断是否为栈的根节点,不是的话就finish掉。
在cocos引擎中也能找到同样的做法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
protected void onCreate(Bundle savedInstanceState) {
super.setEnableVirtualButton(false);
super.onCreate(savedInstanceState);
// Workaround in https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
if (!isTaskRoot()) {
// Android launched another instance of the root activity into an existing task
// so just quietly finish and go away, dropping the user back into the activity
// at the top of the stack (ie: the last state of this task)
// Don't need to finish it again since it's finished in super.onCreate .
return;
}
// DO OTHER INITIALIZATION BELOW

}