如何在 Android 程序中禁止屏幕旋转和重启Activity
禁止屏幕随手机旋转变化
有时候我们希望让一个程序的界面始终保持在一个方向,不随手机方向旋转而变化:
在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入?android:screenOrientation=”landscape”?属性。
landscape = 横向
portrait = 纵向
?
避免在转屏时重启Activity
android中每次屏幕方向切换时都会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次 Create的时候载入配置,那样,进行中的游戏就不会自动重启了!
要避免在转屏时重启Activity,可以通过在AndroidManifest.xml文件中重新定义方向(给每个Activity加上android:configChanges=”keyboardHidden|orientation”属性)。
在需要控制屏幕显示方向的Activity中重写?onConfigurationChanged(Configuration newConfig)方法,这样在转屏时就不会重启Activity了。
01 | if (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){ |
04 | setContentView(R.layout.file_list_landscape); |
09 | setContentView(R.layout.file_list); |
在模拟器中可以按 CTL+F11 模拟做屏幕旋转。
Handler.sendMessage(new Message) 须发送新对象
Handler.sendMessage(new Message). 这个方法是指 Handler 在发送消息的时候,需要发送一个新的对象。也就是每次在发送消息时,在更新了 Date 后,需要重新构造 Message 对象,而不是利用已经构建的对象,否则会报错:
06-27 09:25:39.073: ERROR/AndroidRuntime(1170): android.util.AndroidRuntimeException: { what=0 when=3496212 arg1=10 [email protected] } This message is already in use.
若是了解 Handler 的消息队列机制,就会明白为什么会报“This message is already in use.”的错误了,因为 Handler 每次 sendMessage() 时,都会将一个消息送到一个消息对队列中,所以必须必须是一个新的 Message 对象才行。