我不了解/了解有关Android回调方法及其实现的内容。
我有一个简单的Activity,其实现的回调如:
@Override
onResume() {
Log.i(TAG, "onPause()");
}
@Override
onDestroy() {
Log.i(TAG, "onDestroy()");
}
onButtonPressed() {
while(true) {
Log.i(TAG, "onButtonPressed()");
SystemClock.sleep(1000);
}
}
当我启动应用程序并更改屏幕方向时,我可以在控制台中看到onPause()和onDestroy()日志。 但是,当我按下测试按钮(onButtonPressed())并启动一个持久的过程(同时为true)时,我只能在控制台中看到onButtonPressed()日志。我可以旋转手机,我看到根据方向调整了活动,但是没有调用onDestroy()和onPause()(在控制台中没有日志)回调。
我的活动在定位更改期间是否仍会重新创建?为什么不调用回调?他们是否被其他线程召唤?
任何人都可以向我澄清这种情况并解释Android究竟是如何执行回调方法的调用的吗?
在AndroidN上测试。
谢谢。
更新 看起来这是我身边的错误。 当我旋转手机时,我看到屏幕正在旋转,但还没有意识到活动不是......它只是放在屏幕的一侧(寻找它是Android N上的开发者预览错误)。那让我很困惑:D
感谢您的回答和帮助。
答案 0 :(得分:3)
除非在文档中另有说明,否则所有方法调用和回调通常都在主线程(UI线程)上处理。
这适用于所有生命周期方法,例如示例中的onResume()
和onDestroy()
以及onButtonPressed()
等用户界面回调。
在第二个进入无限while循环的示例中,您完全占用UI线程,因此任何生命周期方法都不能再运行,用户也无法再与应用程序交互。这就是为什么当您旋转设备时,您看不到正在打印的日志语句。当前Activity
永远不会被销毁,并且无法创建新的Activity
,因为您有一个负责在无限循环中执行此操作的线程。
这也是Android文档建议将所有长时间运行的操作从UI线程移出的原因,这样您就不会对用户的体验产生负面影响。