content: package yifeiyuan.practice.practicedemos.screenorientation;
  
  import android.content.Context;
  import android.content.pm.ActivityInfo;
  import android.content.res.Configuration;
  import android.os.Bundle;
  import android.util.Log;
  import android.view.Menu;
  import android.view.MenuItem;
  import android.view.OrientationEventListener;
  import android.view.Surface;
  
  import yifeiyuan.practice.practicedemos.R;
  import yifeiyuan.practice.practicedemos.base.BaseActivity;
  
  /**
   * 参考 : http://ticktick.blog.51cto.com/823160/1301209
   */
  public class OrientationActivity extends BaseActivity {
  
      private MyOrientationEventListener myOrientationEventListener;
  
      @Override
      protected int getLayoutId() {
          return R.layout.activity_config;
      }
  
      @Override
      protected void init(Bundle savedInstanceState) {
  
      }
  
      //Notice 必须在manifests 里配置
      //Notice android:configChanges="screenSize|orientation"  才会有回调
      @Override
      public void onConfigurationChanged(Configuration newConfig) {
          Log.d(TAG, "onConfigurationChanged() called with " + "newConfig = [" + newConfig + "]");
          //Notice 必须调用super!! 否则会崩溃 android.util.SuperNotCalledException: Activity screenorientation.OrientationActivity did not call through to super.onConfigurationChanged()
          super.onConfigurationChanged(newConfig);
  
  //        newConfig.getLayoutDirection();//RTL or LTR
  
          if (Configuration.ORIENTATION_LANDSCAPE == newConfig.orientation) {
              Log.d(TAG, "onConfigurationChanged :" + "landscape 横屏");
          } else if (Configuration.ORIENTATION_PORTRAIT == newConfig.orientation) {
              Log.d(TAG, "onConfigurationChanged :" + "portrait 竖屏");
          }
  
          int rotation = getWindowManager().getDefaultDisplay().getRotation();
  
          switch (rotation) {
              case Surface.ROTATION_0:
                  Log.d(TAG, "onConfigurationChanged rotation:" +"0");
                  break;
              case Surface.ROTATION_90:
                  Log.d(TAG, "onConfigurationChanged rotation:" +"90");
                  break;
              case Surface.ROTATION_180:
                  Log.d(TAG, "onConfigurationChanged rotation:" +"180");
                  break;
              case Surface.ROTATION_270:
                  Log.d(TAG, "onConfigurationChanged rotation:" +"270");
                  break;
          }
          Log.d(TAG, "onConfigurationChanged rotation:" + rotation);
      }
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          Log.d(TAG, "onCreate ");
  
          //无视manifest的设置 强制设置屏幕方向
  //        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);// 横屏
  //        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);// 竖屏
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);// 传感器
  
  
          myOrientationEventListener = new MyOrientationEventListener(this);
          myOrientationEventListener.enable();
  
      }
  
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          getMenuInflater().inflate(R.menu.menu_config, menu);
          return true;
      }
  
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          if (item.getItemId() == R.id.ori_land) {
              setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);// 横屏
          } else if (item.getItemId() == R.id.ori_port) {
              setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);// 竖屏
          } else {
              //这个不会回调onConfigurationChanged 而上面两个会
              setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);// 传感器
          }
          return super.onOptionsItemSelected(item);
      }
  
      @Override
      protected void onRestart() {
          super.onRestart();
          Log.d(TAG, "onRestart ");
      }
  
      @Override
      protected void onStart() {
          super.onStart();
          Log.d(TAG, "onStart ");
      }
  
      @Override
      protected void onResume() {
          super.onResume();
          Log.d(TAG, "onResume ");
      }
  
      @Override
      protected void onPause() {
          super.onPause();
          Log.d(TAG, "onPause ");
      }
  
      @Override
      protected void onStop() {
          super.onStop();
          Log.d(TAG, "onStop ");
      }
  
      @Override
      protected void onDestroy() {
          super.onDestroy();
          Log.d(TAG, "onDestroy ");
  
          //Notice 必须disable 不然页面关闭后  它依然在工作 不断打印
          myOrientationEventListener.disable();
      }
  
  
      private class MyOrientationEventListener extends OrientationEventListener {
  
          public MyOrientationEventListener(Context context) {
              super(context);
          }
          /**
           * @param context
           * @param rate  比率  可以调节灵敏度  SensorManager.SENSOR_DELAY_FASTEST 等
           */
          public MyOrientationEventListener(Context context, int rate) {
              super(context, rate);
          }
  
          @Override
          public void onOrientationChanged(int orientation) {
              Log.d(TAG, "onOrientationChanged() called with " + "orientation = [" + orientation + "]");
  
              //Notice  手机水平放置的时候是-1  OrientationEventListener.ORIENTATION_UNKNOWN
              //手机竖直是0 按顺时针方向 0-359
  
          }
      }
  
  }
  