防止activity转屏幕后调用oncreate的方法


在介绍之前,我们需要先了解默认情况下android屏幕旋转的机制:

默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,则表现为卡顿或者黑屏一段时间。如果是在横竖屏UI设计方面,那么想很好地支持屏幕旋转,则建议在res中建立layout-land和layout-port两个文件夹,把横屏和竖屏的布局文件分别放入对应的layout文件夹中。

了解了这些以后,我们对android的屏幕旋转方法进行如下总结:

1,AndroidManifest.xml设置

如果单单想设置横屏或者竖屏,那么只需要添加横竖屏代码:

android:screenOrientation=”landscape”横屏设置;android:screenOrientation=”portrait”竖屏设置;

这种方法的优点:即使屏幕旋转,Activity也不会重新onCreate。

缺点:屏幕只有一个方向。

2,代码动态设置

如果你需要动态改变横竖屏设置,那么,只需要在代码中调用setRequestedOrientation()函数:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏设置

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏设置

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);//默认设置

这种方法优点:可以随意动态设置,满足我们人为改变横竖屏的要求,同时满足横竖屏UI不同的设计需求;

缺点:如果改变设置,那么,Activity会被销毁,重新构建,即重新onCreate;

3,重写onConfigurationChanged

如果你不希望旋转屏幕的时候Activity被不断的onCreate(这种情况往往会造成屏幕切换时的卡顿),那么,可以使用此方法:

首先,在AndroidMainfest.xml中添加configChanges:

?
1
2
3
</activity>
注意,keyboardHidden表示键盘辅助功能隐藏,如果你的开发API等级等于或高于13,还需要设置screenSize,因为screenSize会在屏幕旋转时改变;
?
1
android:configChanges= "keyboardHidden|orientation|screenSize"

然后,在Activity中重写onConfigurationChanged方法,这个方法将会在屏幕旋转变化时,进行监听处理:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<pre class = "java" name= "code" > public void onConfigurationChanged(Configuration newConfig) {      
  // TODO Auto-generated method stubsuper.onConfigurationChanged(newConfig);       
if (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE) {          
// Nothing need to be done here                  
} else {          
// Nothing need to be done here    
    }                
   }
 
</pre>
<pre class = "brush:java;" ></pre>
 
这个方法的优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作;
缺点:它只能一次旋转 90 度,如果一下子旋转 180 度,onConfigurationChanged函数不会被调用。
4 ,结合OrientationEventListener,自定义旋转监听设置
如果你想更加完美,更加完全的掌控监听屏幕旋转变化,比如,转屏时不想重新onCreate,尤其是在Camera界面,不想出现旋转preview时屏幕的卡顿、黑屏等问题,那么,可以尝试:
  
首先,创建OrientationEventListener对象:
<pre class = "brush:java;" > private OrientationEventListener mOrientationListener; // screen orientation listener</pre><pre class="brush:java;">private boolean mScreenProtrait = true;
private boolean mCurrentOrient = false ;</pre>
然后,自定义屏幕变化回调接口<br>
<pre class = "brush:java;" > abstract protected void OrientationChanged( int orientation); //screen orientation change event</pre>
最后,自定义监听类<br>
<pre class = "brush:java;" > private final void startOrientationChangeListener() {
         mOrientationListener = new OrientationEventListener( this ) {
             @Override
             public void onOrientationChanged( int rotation) {
                 if (((rotation >= 0 ) && (rotation <= 45 )) || (rotation >= 315 )||((rotation>= 135 )&&(rotation<= 225 ))) { //portrait
                  mCurrentOrient = true ;
                  if (mCurrentOrient!=mScreenProtrait)
                  {
                   mScreenProtrait = mCurrentOrient;
                   OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                   Log.d(TAG, "Screen orientation changed from Landscape to Portrait!" );
                  }
                 }
                 else if (((rotation > 45 ) && (rotation < 135 ))||((rotation> 225 )&&(rotation< 315 ))) { //landscape
                  mCurrentOrient = false ;
                  if (mCurrentOrient!=mScreenProtrait)
                  {
                   mScreenProtrait = mCurrentOrient;
                   OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                   Log.d(TAG, "Screen orientation changed from Portrait to Landscape!" );
                  }
                 }
             }
         };
         mOrientationListener.enable();
     }</pre>
在onCreate()中调用:
<pre class = "brush:java;" >startOrientationChangeListener();  </pre>
这个方法的优点:你可以任意随时准确的监听屏幕旋转变化的状态,可以随时动态改变横竖屏状态;
注:对于Camera来说,你可以设置初始化为横屏或者竖屏,然后对外提供旋转监听,这样,既可以获得屏幕旋转状态,让你做出相应的操作,又不会出现重新onCreate当前Activity造成的卡顿与短暂的黑屏切换。<br>
  
<br>
  
<p> </p>
<p> </p>   

一定写上screenSize的啊
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值