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 更深入地描述它的文章
情况是我通过以下方式从我的 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 更深入地描述它的文章