1

在我的 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);
}

当阻塞活动完成时,它调用 ThisClass.blockingActivityFinished()。这将检查对旧活动的弱引用是否仍然存在,如果存在,则从该活动启动原始意图。如果没有,它将从我的应用程序的上下文中启动原始意图。

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

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

4

1 回答 1

4

这听起来合理吗?

我永远不会使用这种技术。WeakReference尽管如此,可变静态数据成员还是很危险的。特别是,如果用户做了不可想象的事情,例如,将他们的手机用作手机,或者以其他方式长时间离开您的应用程序流程,我希望这会失败。您的活动可能会被破坏并且您的进程可能会终止以释放 RAM,但活动将保留在任务中并可能被重新激活。在那一点上,你的状态很糟糕,因为静电被摧毁了。

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

你正在泄漏一个Intent.

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

出于本答案其余部分的目的,我将把您的起点称为活动 A,将“其他操作”称为活动 B,将期望的结束称为活动 C。因此,在您的代码中,newActivityIntent是活动 C,blockingIntent用于活动 B,并且currentActivity是活动 A。

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

选项 #2:将决策过程留在活动 A 中,但将布尔值(例如,true“我们必须显示活动 B”)传递给活动 CIntentstartActivity()调用。活动 C 将布尔值检查并onCreate()立即调用startActivity()活动 B 如果布尔值这么说。

在这些选项中,您可以避免静态问题。

于 2010-09-10T19:13:22.383 回答