在 Activity.onDestroy() 方法之后,为什么我仍然可以获取此活动的实例?



>我创建了一个类来缓存活动,例如:

public class ActivityList {
public static List<WeakReference<Activity>> list = new LinkedList<>();
public static void put(Activity activity) {
list.add(new WeakReference<>(activity));
}
}

以及,onDestroy 方法:

@Override
protected void onDestroy() {
super.onDestroy();
Log..e("test", "call onDestroy");
}

其次,我在系统的开发人员选项中启用"不保留活动",以确保活动在我离开后将被终止

然后,我启动一个活动并将一个实例放入 ActivityList 类中

ActivityList.put(this);

当我将此活动留给另一个活动时,LogCat 显示名为 onDestroy() 的第一个活动。然后在第二个活动中,我得到第一个活动的实例,如下所示:

WeakReference<Activity> weakReference = ActivityList.list.get(0);
Activity activity = weakReference.get();
activity.runOnUiThread(() -> Toast.makeText(this, "HHHH", Toast.LENGTH_SHORT).show());

那么代码运行良好?! 在我看来,第一个活动调用了 onDestroy() 然后我不能再使用它了,所以 Toast 不应该显示。并且在 onDestroy() 之后,没有任何强引用引用该活动,它应该是系统的 GC。

那么,它为什么有效?

弱引用应在垃圾回收中清除,但完成活动可能不会触发 GC。

最新更新