我想更好地理解当按下后退按钮和MainActivity被销毁的静态变量和注册服务时到底发生了什么。
这是我已经知道的:
我需要知道的是:
1.)声明和全局初始化的静态变量会发生什么。
即
静态布尔logging_on_flag = false;
当应用程序运行时,这会变成真,但是如果该活动被后退按钮取消,然后重新创建,它是真还是假?
2.)注册服务(侦听器)会发生什么?
也就是说,我使用来记录我的位置数据。在注册位置侦听器之后,每次位置更改时,系统都会调用方法onLocationChanged()。用这种方法,我做日志记录。当我离开应用程序的后退按钮,这个过程会被打断吗?听众会被取消登记吗?
我很困惑,不得不问这里的专家,因为我的应用程序的后退-按钮行为发生了变化,因为我开始处理碎片。
在此之前:
将应用程序与back按钮放在一起不会中断日志记录过程,但是当再次选择活动时,非静态变量将被恢复。由于侦听器绑定到旧的变量实例,因此更改新实例不再对日志记录过程产生任何影响。此外,侦听器将再次注册,因为这发生在onCreate()中,这会导致双重日志记录(每次测量都记录两次)。
我可以通过使logging_flag静态(这防止了实例化)并签入onCreate()来解决这个问题,如果标志已经是真的,如果是这样的话,侦听器就不会再次注册。这就像一种魅力,因为在重新创造之后,国旗仍然是真的。
在这里和那里实现片段之后:
按后退按钮离开应用程序的行为似乎已经完全改变了。现在,当按下“后退”按钮时,日志记录立即停止,当您回到应用程序时,它将被完全重新启动,甚至静态变量也不再为真而是为false。
有谁能解释一下,为什么行为在静态变量和服务方面发生了变化?
请注意,这是一个一般的问题,以获得一个更好的了解后退按钮。我没有要求一个解决方案(是的,我知道我应该更好地使用savedInstanceState)。
发布于 2017-08-17 15:11:31
静力学不是对象的一部分,所以它们仍然存在,直到您将null赋值给它们。或者杀死应用程序。
回答你的问题: 1)静态意志包含最后的值,2)侦听器将工作,直到你杀死应用程序。必须在“关闭”时注销侦听器。
为什么要改变行为?它并没有改变。我想你犯了什么错误,但你看不见代码就说不出来。
发布于 2017-08-17 15:31:47
静态变量会发生什么,这些变量是全局声明和初始化的。
只要你的应用程序还在运行,他们就会活下去。当您回到系统的主屏幕时,应用程序进程是不必要的(如果系统认为它有足够的资源,它将自动管理)。因此,在下次启动应用程序时,您的静态变量可能仍然有您设置的值。
注册服务(侦听器)会发生什么?
根据您启动服务的方式,即使您不需要它,它仍然可以在后台中运行!。所以,当应用程序停止时,不要忘记停止一切。
关于侦听器,它们仍然会受到服务的影响,这样如果您忘记不注册它们,它就会产生内存泄漏。
结论
您应该避免使用静态变量来存储数据(可以使用最终静态作为常量)。
您应该使用onPause来停止服务/注销侦听器.和onResume重新启动它们。
https://stackoverflow.com/questions/45738549
复制相似问题