活动仍然停留在android中以前的活动之上奇怪的行为

mwyxok5s  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(365)

情况是,我通过以下方式从我的routeactivity中调用一个活动:

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

当我通过以下方式结束活动时,这很好:

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

这会让我回到我的主要导航开始活动,然后当我再次选择返回到我的routeactivity原始时,routecompleteactivity仍然在上面吗?所以我得到的不是routeactivity,而是routeCompleteTActivity,如果我按下back键,它就会转到routeactivity??好像它还记得什么背影?有人能解释一下吗?

baubqpgj

baubqpgj1#

我假设您使用的是viewmodel或存储库中的livedata,它保留了它的值。案例如下: arrived 有一个 true 价值与 onChanged 将被调用。下一次routeactivity观察到达时,onchanged将再次被调用,因为它已经有一个值和另一个值 startAcrivity 将被调用。一个简单的解决方案是使用 SingleLiveEvent 相反,这是谷歌很久以前创建的链接

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 设置新值时。我还建议看一看这篇文章,其中对它进行了更深入的描述

相关问题