生命周期, onconfigchanged 等
测试 代码:
package com.example.configtest;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("调用了 oncreate");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
System.out.println("onRestoreInstanceState");
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
System.out.println("调用了 onStart");
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
System.out.println("调用了 onRestart");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
System.out.println("调用了 onResume");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
System.out.println("调用了 onSaveInstanceState");
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
System.out.println("调用了 onPause");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println("调用了 onDestroy");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
System.out.println("调用了 onConfigurationChanged");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
System.out.println("调用了 onStop");
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
// TODO Auto-generated method stub
super.onWindowFocusChanged(hasFocus);
System.out.println("调用了 onWindowFocusChanged");
}
}
空白 到 启动 :
下拉 通知栏 : 只有 onWindowFocusChanged 发生变化(中间 4个 onWindowFocusChanged是因为下拉-恢复了2次 )
按 返回键:
再次启动 并点击 home键
点击 home键是 从 蓝色 onpause 开始的.
再次 进入:
下面 测试 横竖屏 切换
首先 不在manifest 里面做 android: configchanges 配置:
竖屏 ---> 横屏:
从 honecomb 版本开始, 直到 onstop()返回后, 程序才才可能处于 killable状态, 这意味这 onSaveInstaceState 可能会出现在 onpause后面.
可以看到, 切屏时, 程序 销毁重建了一次. onRestoreInstanceState 出现在 onstart 后面. 通常 用oncreate (bundle) 里完成 onRestoreInstanceState数据处理也是可以的, 应为它们的参数一样的.
下面我们来看 横屏 --> 竖屏:
与上面一样, 网上说 要执行2次但 我这里只执行一次, 也许跟输入法有关.
也就是说 不配置 , 无论 横竖 都 要重建 一次(且不会调用 onConfigurationChanged)
配了 orientation 后, 调用该函数一次且 要重建一次
----------------------------------------------------------------------------------
android:configChanges="orientation"
竖屏--->横屏:
横屏--->竖屏:
----------------------------------------------------------------------------------------------------------------
android:configChanges="orientation|keyboardHidden"
竖屏--->横屏:
横屏--->竖屏:
用的华为 4.4android系统.
从 honecomb -3.1 版本开始有了变化
已查明原因, 新版机器就是这样 要想 不重建 需要加上 android:configChanges="orientation|screenSize"
有了这个, 切屏(无论横竖 )都只调用 一次 :
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
新建一个 老版本的 模拟器 试一下
这次用的是 2.2 的模拟器
前面的 启动 返回键 都是一样的结果 .
按下 home键时 有些 变化:
这个 onSaveInstaceState 跑到onpause 前面去了
在不配置 android:configchenges 时: 结果 如下
竖屏--->横屏:
同样 也是 onSaveInstaceState 跑到onpause 前面去了
横屏--->竖屏:
这个是真正 执行了2次.
android:configChanges="orientation"
竖屏--->横屏:
横屏-->竖屏:
多了 一个函数
------------------------------------------------------------------------------------------------------------------------
android:configChanges="orientation|keyboardHidden"
竖屏--->横屏:
顺便说一下 , 弹出 toast或者 自己的dialog 不会调用 生命周期函数的. (除非 该dialog是 别人的, 这也是 dialog创建时 的context的一个作用).