Activity restart on rotation Android

In my Android application, when I rotate the device (slide out the keyboard) then my Activity is restarted ( onCreate is called). Now, this is probably how it's supposed to be, but I do a lot of initial setting up in the onCreate method, so I need either:

  • Put all the initial setting up in another function so it's not all lost on device rotation or
  • Make it so onCreate is not called again and the layout just adjusts or
  • Limit the app to just portrait so that onCreate is not called.

  • Using the Application Class

    Depending on what you're doing in your initialization you could consider creating a new class that extends Application and moving your initialization code into an overridden onCreate method within that class.

    public class MyApplicationClass extends Application {
      @Override
      public void onCreate() {
        super.onCreate();
        // TODO Put your application initialization code here.
      }
    }
    

    The onCreate in the application class is only called when the entire application is created, so the Activity restarts on orientation or keyboard visibility changes won't trigger it.

    It's good practice to expose the instance of this class as a singleton and exposing the application variables you're initializing using getters and setters.

    NOTE: You'll need to specify the name of your new Application class in the manifest for it to be registered and used:

    <application
        android:name="com.you.yourapp.MyApplicationClass"
    

    Reacting to Configuration Changes [UPDATE: this is deprecated since API 13; see the recommended alternative]

    As a further alternative, you can have your application listen for events that would cause a restart – like orientation and keyboard visibility changes – and handle them within your Activity.

    Start by adding the android:configChanges node to your Activity's manifest node

    android:configChanges="keyboardHidden|orientation"
    

    or for Android 3.2 (API level 13) and newer:

    android:configChanges="keyboardHidden|orientation|screenSize"
    

    Then within the Activity override the onConfigurationChanged method and call setContentView to force the GUI layout to be re-done in the new orientation.

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
      super.onConfigurationChanged(newConfig);
      setContentView(R.layout.myLayout);
    }
    

    Update for Android 3.2 and higher:

    Caution : Beginning with Android 3.2 (API level 13), the "screen size" also changes when the device switches between portrait and landscape orientation. Thus, if you want to prevent runtime restarts due to orientation change when developing for API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), you must include the "screenSize" value in addition to the "orientation" value. That is, you must declare android:configChanges="orientation|screenSize" . However, if your application targets API level 12 or lower, then your activity always handles this configuration change itself (this configuration change does not restart your activity, even when running on an Android 3.2 or higher device).


    Instead of trying to stop the onCreate() from being fired altogether, maybe try checking the Bundle savedInstanceState being passed into the event to see if it is null or not.

    For instance, if I have some logic that should be run when the Activity is truly created, not on every orientation change, I only run that logic in the onCreate() only if the savedInstanceState is null.

    Otherwise, I still want the layout to redraw properly for the orientation.

    public void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_game_list);
    
            if(savedInstanceState == null){
                setupCloudMessaging();
            }
    }
    

    not sure if this is the ultimate answer, but it works for me.

    链接地址: http://www.djcxy.com/p/24660.html

    上一篇: 在球面上写文字SceneKit?

    下一篇: 活动在Android上重新启动