【发布时间】:2015-11-05 11:37:49
【问题描述】:
我有两个活动。 1]启动画面 2]主活动
一旦启动屏幕任务移动到下一个 MainActivity.. 但我的要求是..如果用户按下主页按钮或 backPress 。当用户再次恢复应用程序时,它应该从启动屏幕开始,而不是从 MainActivity。
提前谢谢
【问题讨论】:
标签: android splash-screen
我有两个活动。 1]启动画面 2]主活动
一旦启动屏幕任务移动到下一个 MainActivity.. 但我的要求是..如果用户按下主页按钮或 backPress 。当用户再次恢复应用程序时,它应该从启动屏幕开始,而不是从 MainActivity。
提前谢谢
【问题讨论】:
标签: android splash-screen
我看到这里的每个答案都说要覆盖 onResume() 方法。这是一个坏主意。为什么?好吧,当您在MainActivity 并接到电话时,您仍然可以在后台看到活动,因为它处于onPause() 状态。当您关闭呼叫时,将调用onResume(),然后将调用SplashActivity。这不是一个好的用户体验,也不是您想要的。
另外,onResume() 在MainActivity 的创建过程中被调用。因此,如果您将startActivity() 代码放入onResume() 而不进行任何条件检查,您将永远不会看到MainActivity 本身。 SplashActivity 将在 MainActivity 创建后立即启动。
那么,如何实现你想要的呢?
一旦从SplashActivity 开始MainActivity,不要将finish() 改为SplashActivity。让它留在后台堆栈中,所以当你按下返回按钮时,你会转到SplashActivity。
在您的MainActivity 的onStop() 方法中设置一个标志以注意MainActivity 已最小化。然后在onStart() 中检查此标志并仅在设置此标志时启动SplashActivity。这是为了确保应用已最小化并正在恢复。
MainActivity:
private boolean isMinimized = false;
@Override
protected void onStop() {
super.onStop();
isMinimized = true;
}
@Override
protected void onStart() {
super.onStart();
if(isMinimized){
startActivity(new Intent(this , SplashActivity.class));
isMinimized = false;
finish();
}
}
【讨论】:
onStop 中设置的标志在onStart 中启动Acitivity。
如果您在开始新的 Activity 之前没有完成您的 Activity,您将在后按时返回 Splash Activity。
覆盖 OnResume 并启动您的启动 Activity,以便在应用程序恢复时从启动启动它。
@Override
protected void onResume() {
super.onResume();
startActivity(new Intent(this , SplashActivity.class));
finish();
}
就这样……
【讨论】:
在您的SplashScreen AndroidManifest.xml 文件的intent-filter 中将Home 用作类别
<intent-filter>
....
//-- this will show up your app when home button pressed (like laucher)
<category android:name="android.intent.category.HOME" />
</intent-filter>
覆盖它们以启动闪屏
@Override
public void onBackPressed() {
startActivity(new Intent(this , SplashActivity.class));
finish();
}
关于恢复
在进入运行状态之前,OnResume 是根据 this 调用的,所以如果你在 onResume 调用其他活动,当前甚至不会启动,它会直接执行声明的意图,
【讨论】:
在您的 MainActivity 中尝试此代码
@Override
protected void onResume() {
super.onResume();
startActivity(new Intent(this , SplashActivity.class));
finish();
}
编辑你可以使用flag来检测onResume第一次被调用的时间
int flag = 0;
并将您的 onResume 代码更改为以下:
@Override
protected void onResume() {
super.onResume();
if(flag == 0) {
flag = 1 ;
}
else {
flag = 1 ;
startActivity(new Intent(this, SplashActivity.class));
finish();
}
}
【讨论】: