我的第一个Android应用程序在旋转时崩溃了

时间:2015-02-18 05:47:37

标签: android

每当我将Nexus从纵向旋转到横向或从横向旋转到纵向时,我的应用都会崩溃。它产生了下面的异常报告,我不明白。

我基本上按照它说的做了,发现我的主要活动onDestroy功能并添加了super.onDestroy,这使问题消失了。

但是,为什么会这样呢?为什么onDestroy只是因为我旋转了平板电脑才开始发挥作用?

02-18 00:43:28.504  28259-28259/com.mpr.myfirstapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.mpr.myfirstapp, PID: 28259
android.util.SuperNotCalledException: Activity {com.mpr.myfirstapp/com.mpr.myfirstapp.MainActivity} did not call through to super.onDestroy()
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3660)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3689)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3889)
at android.app.ActivityThread.access$900(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5223)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

4 个答案:

答案 0 :(得分:8)

打开AndroidManifest.xml并将此属性添加到您的活动中:

<activity android:name=".YourActivityName" android:configChanges="orientation|screenSize|keyboardHidden" />

当您旋转屏幕而不添加orientation值时,可能会重新创建活动。

答案 1 :(得分:6)

这个问题的答案可以在这里找到:

  

http://developer.android.com/guide/topics/resources/runtime-changes.html

您遇到的实际上是Android活动的默认行为。当方向发生变化时,与活动相关的资源可能会发生变化并需要进行管理。这些情况通常使用onSaveInsatanceState()onRestoreInstanceState()方法处理,其用法在文档中突出显示。

答案 2 :(得分:4)

Activity在轮换前被销毁。然后在新方向再次创建它。

  

派生类必须调用超类的实现   这种方法。如果他们不这样做,将抛出异常。

这是一个实现细节。这是彻底documented

  

protected void onDestroy()

     

在API级别1中添加在活动开始之前执行任何最终清理   销毁。这可能是因为活动正在结束   (有人称之为finish(),或者因为系统是暂时的   销毁此活动实例以节省空间。您可以   使用isFinishing()方法区分这两种情况。

     

注意:不要指望将此方法称为保存地点   数据!例如,如果活动正在编辑内容中的数据   提供者,这些编辑应该在onPause()或   onSaveInstanceState(Bundle),不在这里。这种方法通常是   实现释放资源,如与线程相关联的线程   活动,以便被破坏的活动不会留下这样的东西   当其余的应用程序仍在运行时。有   系统将简单地杀死活动的托管的情况   进程中没有调用此方法(或任何其他方法),所以它   不应该被用来做那些打算留下来的东西   过程消失后。

     

派生类必须调用超类的实现   这种方法。如果他们不这样做,将抛出异常。

答案 3 :(得分:2)

通过查看日志,我假设您已将onDestroy()方法编写如下,

@Override
protected void onDestroy() {
}

实际上您忘了在super.onDestroy();方法中拨打onDestroy(),所以实际上您的onDestroy()方法应该如下所示,

@Override
protected void onDestroy() {
    super.onDestroy();               // Add this line
}

这可以解决您的问题。