避免Android中的活动的双重示例

jmp7cifd  于 2023-05-15  发布在  Android
关注(0)|答案(4)|浏览(165)

我做了一个简单的基于内容的应用程序。应用程序总是启动与启动画面。3秒后,它从SpalshActivity转到MainActivity。但我正面临一个问题。如果我按下返回按钮时,应用程序显示启动画面,并再次启动应用程序从设备应用程序列表,然后应用程序正常启动,但然后我必须按下返回图标两次退出应用程序。因为应用程序具有上次启动的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);
}

 }
kqlmhetl

kqlmhetl1#

在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);
dxxyhpgq

dxxyhpgq2#

让我先总结一下症状

  • 您启动应用程序。
  • 在显示闪屏时按下后退键
  • 重新启动应用程序,显示启动屏幕,然后显示MainActivity
    *按下返回,显示另一个主活动
  • 再次按下“返回”按钮,退出应用程序

原因是你的postDelayed hander仍然运行,即使你按回。您的手机正确启动了SplashActivity,但另一个MainActivity正在从旧的SplashActivity启动。
您需要在进入后台时删除postDelayed回调。保留对该Handler的引用并调用removeCallbacksAndMessages。我通常会在onResume中启动postDelayed,然后在onPause中删除它
或者,您可以使用FLAG_ACTIVITY_CLEAR_TOP标志启动MainActivity。该标志表示如果MainActivity已经存在于后端堆栈中,则应将其置于前端,并关闭其上方的Activity。如果您希望FLAG_ACTIVITY_SINGLE_TOP重用相同的Activity示例,而不是创建一个新示例,您也可以添加FLAG_ACTIVITY_SINGLE_TOP

blpfk2vs

blpfk2vs3#

让我给予你我的方法来避免这个错误:
在你的“super.onCreate(null);”之前添加这个“在onCreate方法中

if (!isTaskRoot()
                && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
                && getIntent().getAction() != null
                && getIntent().getAction().equals(Intent.ACTION_MAIN)) {
            finish();
            return;
        }

super.onCreate(null);

当它不是taskroot时,只要调用它,它就会完成splashactivity。
第二个选择是去掉postdelayed,它是一个会扰乱进程的函数。

dw1jzc5e

dw1jzc5e4#

此方法可导致打开两次:

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

我解决了我的问题,删除了这个。

相关问题