我想更好地理解按下后退按钮时发生的确切情况,以及静态变量和注册服务中的MainActivity被破坏。
这就是我所知道的:
我需要知道的是:
1。)对于全局声明和初始化的静态变量会发生什么。
即
static boolean logging_on_flag = false;
当应用程序运行时,这会变为true,但如果活动被后退按钮销毁然后重新创建,它会是真还是假?
2.。)注册服务(听众)会发生什么?
即,我使用位置服务来记录我的位置数据。注册Location侦听器后,每次Location更改时,System都会调用onLocationChanged()方法。在那个方法中,我做了日志记录。 当我使用后退按钮离开应用程序时,此过程会被中断吗?听众是否会被取消注册?
我很困惑并且被迫在这里问专家,因为自从我开始使用Fragments以来我的应用程序的后退按钮行为发生了变化。
在:
使用后退按钮离开应用程序不会中断日志记录过程,但是再次选择活动时会重新调整非静态变量。由于侦听器绑定到旧的变量实例,因此更改新实例不再对日志记录过程产生任何影响。此外,监听器将再次注册,因为这是在onCreate()中发生的,这导致双重记录(每次测量都被记录两次)。
我可以通过使logging_flag静态(阻止实现)和检查onCreate()来解决这个问题,如果该标志已经为真,并且如果是这种情况,则不会再次注册监听器。这就像一个魅力,因为重建后旗帜仍然是真实的。
在这里和那里实施片段之后:
按下后退按钮离开应用程序的行为似乎已完全改变。现在,当按下后退按钮时,日志记录会立即停止,当您返回应用程序时,它会完全重新启动,甚至静态变量也不再是真的,而是假的。
任何人都能解释一下,为什么行为在静态变量和服务方面发生了变化?
请注意,这是一个常见问题,可以更好地了解后退按钮。我不是要求解决方案(是的,我知道我应该更好地使用savedInstanceState)。
答案 0 :(得分:0)
静态不是对象的一部分,因此它们仍然存活,直到您为它们指定null。或者杀死申请。
回答你的问题: 1)static将包含最后一个值 2)监听器将一直工作,直到你杀死app。您必须取消注册侦听器。
为什么行为改变?它没有改变。我认为你犯了一些错误,但是如果没有看到代码就无法分辨。
答案 1 :(得分:0)
声明和初始化的静态变量会发生什么 全局。
只要您的应用程序流程存在,它们就会存在。当您返回系统的主屏幕时,不必杀死应用程序进程(如果系统认为它有足够的资源,系统会自动管理它)。因此,下次启动应用程序时,您的静态变量仍可能具有您设置的值。
注册服务(听众)会发生什么?
根据您启动该服务的方式,即使您不需要它,它仍然可以在后台运行!。因此,不要忘记在应用程序停止时停止所有内容。
关于听众,他们仍会受到影响,因此如果您忘记取消注册,可能会造成内存泄漏。
您应该避免使用静态变量来存储数据(您可以将final static用作常量)。
您应该使用onPause
来停止服务/取消注册侦听器......并onResume
重新启动它们。