我有2项活动
活动A有一个注册的接收器,用于更新静态通用列表。
活动B访问活动A中的静态通用列表。
问题是:
如果活动A结束(被系统杀死),则注册的接收器停止,这使得静态通用列表中的数据不可靠,因为它取决于要更新的注册接收器。
静态通用列表没有被注册的接收器终止(null / zeroed)的最大问题,尽管它们都是由同一个活动创建的。
因此,当创建活动B时,我无法知道我的静态通用列表变得不可靠,无法使用新数据重新加载它。
也没有办法 - 监听器 - 监听已注册的接收器终止,我已经终止了通用静态列表,并在活动B创建中检查它,如果它为空,我将重新加载一个新数据。 / p>
正如您所知,当系统终止活动时,无法保证会调用onDestroy,否则我将终止通用静态列表。
我甚至在活动A中添加了一个静态布尔值var(mAlive),它具有默认值(false)并在onCreate中变为(true),希望当活动A被销毁时,(mAlive)将变为false(默认值)声明中的值,我可以在活动B中检查,知道已注册的接收器已终止且数据不可靠并重新加载,但事实证明,即使销毁活动A,也不会重置静态布尔值var( mAlive)为其默认值(false)。
所以,请提出任何建议,我在过去两周内试图找到一个解决方案。
谢谢
答案 0 :(得分:1)
您似乎非常误解Activity Lifecycle。
一次只能运行一个Activity。当新的一个启动时,当前的一个暂停,您无法直接从另一个Activity访问一个Activity中包含的任何内容。静态变量可以包含简单数据,但不建议将其作为避免处理活动生命周期的方法。
要在活动之间传递数据,请使用Intents和Extras。 How do I pass data between Activities in Android application?
如果您希望两个活动共享相同的数据,您可以使用包含可从两个活动访问的数据的Service。
答案 1 :(得分:0)
您可以从所需活动的onDestroy()
方法中播放广播(BroadcastReceiver Example)。然后在您所需的活动中接收广播。
答案 2 :(得分:0)
您可以将数据放入单独的对象中,这样就不会影响活动A的生命周期。您可以在Finder部分看到示例here
我认为您可以通过活动A和B扩展父活动。在您的父活动中,您可以将接收者注册到其// Find minimum x value so that x + d = y
template<typename T, bool supportDenormals = false>
T subtractMost (const T y, const T d)
{
T x = y - d;
while (true)
{
const T nextX =
x == 0 && !supportDenormals
? -std::numeric_limits<T>::min()
: nextafter (x, -std::numeric_limits<T>::infinity());
if (nextX + d != y)
return x;
T step = x - nextX;
while (true)
{
const T nextStep = step + step;
if (x - nextStep + d != y)
break;
step = nextStep;
}
x -= step;
}
}
方法中,然后将其注销到其onResume
方法中。通过这种方式,您应该始终将您的接收器注册到当前活动。
然后,如果您已阅读上一个链接,如果您让Finder负责保留您的新数据并将其引用到您的父活动中(因此您可以参考活动A和活动B),那么您应该足够确定由当前活动活动引用的变量不能被系统销毁。
我确定不明白你的需要,让我知道