完全刷新你的后台堆栈可能是矫枉过正的,可能会给用户体验增加一些开销/滞后;正如您所提到的,大多数应用程序将无法访问完整的静态后台堆栈。
您本质上是在描述一个更普遍的问题:对主题或 WindowManager 本身的全局更改会影响随后的视图绘制。但可能不会重绘堆栈中活动的先前布局。在这种情况下,您可能会觉得很奇怪,但也可能有很多很好的理由说明一旦用户返回到堆栈中,人们不想在堆栈中重绘 Activity。所以这不是一个自动功能。
我可以想到几个选项:
1)编写一个继承自 Activity 的自定义类,当它再次移动到堆栈的前面时,它的所有视图都将失效。例如 in onResume()
or onRestart()
, call (if in Fragment
)
View view = getActivity().findViewById(R.id.viewid);
view.invalidate();
将此自定义活动用于您希望与当前日/夜模式保持一致的所有活动。
2)使用ActivityLifecycleCallbacks
。这有助于将所有逻辑保存在一个地方,并避免需要如上所述的自定义继承。当活动暂停/恢复时,您可以根据需要在此处使您的视图无效。例如,如果是您的应用程序正在更改主题,您可以包含一个 Listener,并记录为SharedPreference
。
要使用,请将回调添加到您的 Application 类:
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void
onActivityCreated(Activity activity, Bundle savedInstanceState) {
//can check type of Activity for custom behaviour, if using inheritance
if(activity instanceof MainActivity) {
mMainActivities.put(activity, new MainActivityEntry((MainActivity)activity));
//...
}
}
@Override
public void
onActivityDestroyed(Activity activity) {
}
@Override
public void
onActivityPaused(Activity activity) {
}
@Override
public void
onActivityResumed(Activity activity) {
if(activity instanceof MainActivity) {
//...
}
//can update Entry properties too
final MainActivityEntry activityEntry = mMainActivities.get(activity);
if(activityEntry != null) {
//record state /perform action
}
}
@Override
public void
onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void
onActivityStarted(Activity activity) {
}
@Override
public void
onActivityStopped(Activity activity) {
}
});