WeakReference to Activity(Android)

WeakReference to Activity(Android),android,memory-leaks,android-activity,weak-references,Android,Memory Leaks,Android Activity,Weak References,在我的Android应用程序中,当用户试图从一个活动转换到另一个活动时,可能会出现一些全局状态,表明他们需要先完成一些其他操作 为了实现这一点,我用以下代码编写了一个类: private static WeakReference<Activity> oldActivityReference; private static Intent waitingIntent; public static void pushActivity(Activity currentActivity, I

在我的Android应用程序中,当用户试图从一个活动转换到另一个活动时,可能会出现一些全局状态,表明他们需要先完成一些其他操作

为了实现这一点,我用以下代码编写了一个类:

private static WeakReference<Activity> oldActivityReference;
private static Intent waitingIntent;

public static void pushActivity(Activity currentActivity, Intent newActivityIntent) {
    Intent blockingIntent = ThisClass.getBlockingActivity();
    if (blockingIntent != null) {
        ThisClass.oldActivityReference = new WeakReference<Activity>(currentActivity);
        ThisClass.waitingIntent = newActivityIntent;
        currentActivity.startActivity(blockingIntent);
        return;
    }
    currentActivity.startActivity(newActivityIntent);
}
私有静态WeakReference oldActivityReference;
私有静态意图等待内容;
公共静态活动(活动currentActivity、意图newActivityIntent){
Intent blockingcontent=this class.getBlockingActivity();
如果(阻塞内容!=null){
ThisClass.oldActivityReference=新的WeakReference(currentActivity);
ThisClass.WaitingContent=newActivityIntent;
currentActivity.startActivity(阻塞内容);
回来
}
currentActivity.startActivity(newActivityIntent);
}
当阻塞活动完成时,它将调用此类。blockingActivityFinished()。这将检查对旧活动的弱引用是否仍然存在,如果存在,则从该活动启动原始意图。如果没有,它将从我的应用程序的上下文启动原始意图

我的问题是,
这听起来正常吗?这种技术是否存在任何潜在的内存泄漏问题?有没有更好的方法来实现这一点?

编辑- 需要明确的是,可能触发中断的事件类型有:1)服务器ping指示当前应用程序版本已弃用2)任何服务器RPC指示用户的凭据不再有效。我不想为每个活动添加逻辑来处理这些检查,并在它们完成后恢复正常业务。这违反了DRY,并且在团队环境中容易出错

这听起来正常吗

我从不使用这种技术。可变静态数据成员是危险的,
WeakReference
尽管如此。特别是,如果用户做了一些不可想象的事情,比如说,将他们的手机用作手机,或者长时间离开应用程序流,我认为这会失败。您的活动可能会被销毁,您的进程可能会终止以释放RAM,但这些活动仍将保留在任务中,并且可能会被重新激活。在这一点上,你的状态很糟糕,因为静力学被核攻击了

这种技术是否存在任何潜在的内存泄漏问题

您正在泄漏
意图

有没有更好的方法来实现这一点

在本答案的其余部分中,我将把您的起点称为活动A,“其他一些操作”称为活动B,期望的终点称为活动C。因此,在您的代码中,
newActivityIntent
表示活动C,
blockingcontent
表示活动B,
currentActivity
表示活动A

选项1:将决策过程放在活动C中,而不是活动A中。让活动C检查
onCreate()
中的条件,如果条件要求显示活动B,则立即调用活动B的
startActivity()

选项#2:将决策过程留在活动A中,但将布尔值(例如,
true
传递给
Intent
中的“我们要显示活动B”)作为活动C的
startActivity()
调用的额外值。活动C在
onCreate()
中检查布尔值,并立即调用
startActivity()
用于活动B,如果布尔值如此表示

在这些选项中,可以避免静态

这听起来正常吗

我从不使用这种技术。可变静态数据成员是危险的,
WeakReference
尽管如此。特别是,如果用户做了一些不可想象的事情,比如说,将他们的手机用作手机,或者长时间离开应用程序流,我认为这会失败。您的活动可能会被销毁,您的进程可能会终止以释放RAM,但这些活动仍将保留在任务中,并且可能会被重新激活。在这一点上,你的状态很糟糕,因为静力学被核攻击了

这种技术是否存在任何潜在的内存泄漏问题

您正在泄漏
意图

有没有更好的方法来实现这一点

在本答案的其余部分中,我将把您的起点称为活动A,“其他一些操作”称为活动B,期望的终点称为活动C。因此,在您的代码中,
newActivityIntent
表示活动C,
blockingcontent
表示活动B,
currentActivity
表示活动A

选项1:将决策过程放在活动C中,而不是活动A中。让活动C检查
onCreate()
中的条件,如果条件要求显示活动B,则立即调用活动B的
startActivity()

选项#2:将决策过程留在活动A中,但将布尔值(例如,
true
传递给
Intent
中的“我们要显示活动B”)作为活动C的
startActivity()
调用的额外值。活动C在
onCreate()
中检查布尔值,并立即调用
startActivity()
用于活动B,如果布尔值如此表示


在这些选项中,您可以避免静态操作。

1)如果操作系统正在破坏我的活动,我不确定这有多不安全?我的意思是,我确实检查了活动是否仍然存在。2) 是吗?我不认为这个意图被泄露了。它唯一会泄漏的时间是如果阻塞活动没有正确地回调,即使这样,一旦启动新活动,它也会被清空。有意延长生命周期!=漏3) 这正是我想要避免的。这些是全局状态——例如用户失去身份验证。选项1或2导致严重违反DRY,并且在团队环境中正在乞求bug。我不确定我是否理解第一部分。。。这会导致活动保留在任务中吗?WeakReference是指