Activity 仍然停留在 Android 之前的 activity 奇怪行为

Activity still staying over previous activity in Android Strange Behaviour

情况是我通过以下方式从我的 RouteActivity 调用 activity:

arrived.observe(this, new Observer<Boolean>() {
            @Override
            public void onChanged(Boolean aBoolean) {
                if(aBoolean==true){
                    Intent intent = new Intent(MyApplication.getAppContext(), RouteCompleteActivity.class);
                    startActivity(intent);
                    overridePendingTransition(R.anim.slide_up, R.anim.do_nothing);
                    finish();
                }
            }
        });

这很好,然后当我通过调用关闭 activity 时:

Intent navIntent = new Intent(MyApplication.getAppContext(), NavigationStartActivity.class);
                navIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(navIntent);
                finish();

这让我回到了我的主要 NavigationStartActivity,然后当我再次选择回到我原来的 RouteActivity 时,RouteCompleteActivity 仍然在上面吗?所以我得到的不是 RouteActivity,而是 RouteCompleteActivity 然后如果我按回它会转到 RouteActivity?好像它记得一些后台?谁能解释一下?

我假设您正在使用来自 viewModel 或存储库的 LiveData 来保持其值。情况是这样的:arrived 有一个 true 值,onChanged 将被调用。下次 RouteActivity 观察到达时,将再次调用 onChanged,因为它已经有一个值,并且将调用另一个 startAcrivity。一个简单的解决方案是使用 SingleLiveEvent 而不是 google 很久以前 link

创建的
public class SingleLiveEvent<T> extends MutableLiveData<T> {

private static final String TAG = "SingleLiveEvent";

private final AtomicBoolean mPending = new AtomicBoolean(false);

@MainThread
public void observe(LifecycleOwner owner, final Observer<T> observer) {

    if (hasActiveObservers()) {
        Log.w(TAG, "Multiple observers registered but only one will be notified of changes.");
    }

    // Observe the internal MutableLiveData
    super.observe(owner, new Observer<T>() {
        @Override
        public void onChanged(@Nullable T t) {
            if (mPending.compareAndSet(true, false)) {
                observer.onChanged(t);
            }
        }
    });
}

@MainThread
public void setValue(@Nullable T t) {
    mPending.set(true);
    super.setValue(t);
}

/**
 * Used for cases where T is Void, to make calls cleaner.
 */
@MainThread
public void call() {
    setValue(null);
}
}

它只是在设置新值时调用 onChange。我还建议看一下 this 更深入地描述它的文章