2015-04-01 49 views
1

我已经完成了一个简单的基于内容的应用程序。应用始终以启动画面启动。 3秒后,它从SpalshActivity进入MainActivity。但是我面临一个问题。如果我在应用程序显示启动画面时按回按钮,并再次从设备应用程序列表启动应用程序,然后应用程序正常启动,但然后我必须按两次图标退出应用程序。因为应用程序具有上次启动的MainActivity的另一个实例。在android中避免双重活动

我该如何避免这种双重事件?

public class SplashActivity extends Activity { 

private static int SPLASH_TIME_OUT = 2000; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.splash_screen); 

    new Handler().postDelayed(new Runnable() { 


     @Override 
     public void run() { 

      Intent i = new Intent(SplashActivity.this, 
        MainActivity.class); 
      startActivity(i); 

      finish(); 
     } 
    }, SPLASH_TIME_OUT); 
} 

} 
+0

发布您的代码。 – 2015-04-01 22:30:13

+0

@JaredBurrows编辑。代码已经给出 – 2015-04-01 22:34:53

+0

如果你退出你的应用程序,如果你点击后退按钮,这将再次运行。如果你点击主页按钮,如果将恢复你的'MainActivity'。你的问题是什么? – 2015-04-01 22:36:28

回答

1

让我总结第一

  • 症状你启动应用程序。
  • 按返回在显示启动画面
  • 重新启动,显示启动画面,然后MainActivity
  • 按返回这表明另一个MainActivity
  • 按返回这再次退出应用程序的应用

原因是即使您按回来,您的postDelayed手柄仍然会运行。您的手机正确启动SplashActivity,但另一个MainActivity正在从旧SplashActivity启动。

当您进入后台时,您需要删除您的postDelayed回调。请保留对该Handler的参考,并致电removeCallbacksAndMessages。我通常会在onResume开始postDelayed并删除它

或者你可以启动MainActivityFLAG_ACTIVITY_CLEAR_TOP标志。该标志表示如果MainActivity已经存在于后端堆栈中,则应该将其置于前端,并且应该关闭它之上的活动。如果您希望它重新使用相同的活动实例,而不是创建新实例,则还可以添加FLAG_ACTIVITY_SINGLE_TOP

+1

thnx解释。现在对我来说很清楚。这将得到明确解决。 – 2015-04-01 23:13:30

0

在你的manifest.xml,增加了MainActivity

android:launchMode="singleTop" 

当你启动你的活动:

Intent intent = new Intent(this, MainActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
+0

如果您通过意图指定了xml而不是代码,该怎么办?有关系吗? – ZakTaccardi 2016-09-16 00:31:57