在我的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,在团队环境中容易出错。
答案 0 :(得分:4)
这听起来是否合理?
我从不使用这种技术。可变静态数据成员是危险的,WeakReference
尽管如此。特别是,如果用户做了不可想象的事情,并且比如说将手机用作手机,或者让应用程序流出很长一段时间,我希望这会失败。您的活动可能会被销毁并终止您的流程以释放RAM,但活动将保留在任务中并可能会重新激活。那时候,你的状态很糟糕,因为静力学已经被破坏了。
此技术是否存在潜在的内存泄漏问题?
您正在泄漏Intent
。
有没有更好的方法来实现这一目标?
出于本答案其余部分的目的,我将把您的起点称为活动A,将“其他一些操作”称为活动B,将期望的结尾称为活动C.因此,在您的代码中,newActivityIntent
适用于活动C,blockingIntent
适用于活动B,currentActivity
适用于活动A.
选项#1:将决策过程放在活动C中,而不是活动A.让活动C检查onCreate()
中的条件,如果条件需要活动,立即调用活动B的startActivity()
B将被展示。
选项#2:将决策过程保留在活动A中,但是在true
额外的Intent
传递布尔值(例如,startActivity()
为“我们必须显示活动B”)调用活动C.活动C检查onCreate()
中的布尔值,如果布尔值这样,则立即调用活动B的startActivity()
。
在这些选项中,您可以避免静态。