Android 处理横竖屏切换事件
默认情况下,Activity在Configuration变化(比如设备横竖屏切换)时,会执行onDestory()周期函数,然后onCreate(),重新创建Activity。之所以这样是因为这样可以让Activity动态适应Configuration,比如横屏时使用横屏的layout,drawable等resources,竖屏时使用竖屏的layout,drawable等resources。重启Activity可能导致大量数据的重新获取,网络连接的重新建立等问题,用户体验非常差。Android Dev guide给出两种解决方案
1)在Configuration变化时,保持数据不变
2)你自己处理,而不是重启Activity
下面分别详细介绍一下这两种方法
1)在Configuration变化时,保持数据不变。需要注意的是我们不应该保存那些依赖Activity的数据,比如Drawable,Adapter,View或者任何与Context相关联的数据。因为上一个Activity已经没有了,如果你还要保持这些资源的引用,可能导致资源泄露。使用方法如下:
重写Activity.onRetainNonConfigurationInstance(),保存数据
@Overridepublic Object onRetainNonConfigurationInstance() { final MyDataObject data = collectMyLoadedData(); return data;}
@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance(); if (data == null) { data = loadMyData(); } ...}
<activity android:name=".MyActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/app_name">
@Overridepublic void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Checks the orientation of the screen if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); }}