在android中避免双重活动实例

时间:2015-04-01 22:08:16

标签: android android-activity

我做了一个简单的基于内容的应用程序。应用程序始终使用启动画面启动3秒后,它将从SpalshActivity转到MainActivity。但我正面临一个问题。如果我在应用程序显示启动画面时按回按钮并再次从设备应用程序列表启动应用程序然后应用程序正常启动但我必须按两次图标才能退出应用程序。因为app上次启动时有另一个MainActivity实例。

如何避免这种双重实例?

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);
}

 }

2 个答案:

答案 0 :(得分:1)

让我先概述一下症状

  • 您启动了该应用。
  • 显示启动画面时按向后
  • 重新启动显示启动屏幕,然后显示MainActivity
  • 的应用
  • 按回来显示另一个MainActivity
  • 再次按退出该应用程序

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

当您进入后台时,您需要删除postDelayed回调。保留对Handler的引用并致电removeCallbacksAndMessages。我通常会在postDelayed中启动onResume并在onPause

中将其删除

或者,您可以使用MainActivity标记启动FLAG_ACTIVITY_CLEAR_TOP。该标志表示如果后备堆栈中已存在MainActivity,则应将其置于前面,并应关闭其上方的活动。如果您希望重新使用相同的活动实例而不是创建新活动实例,也可以添加FLAG_ACTIVITY_SINGLE_TOP

答案 1 :(得分: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);