每当我将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)
答案 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
}
这可以解决您的问题。