public class HelloActivity extends Activity {
public static final String TAG = "HelloActivity";
/**
* 第一个被运行的方法
* 初始化页面
* Bundle恢复上次的状态
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.v(TAG, "onCreate");
}
/**
* 从onStop回到Activity的时候会执行
* 按HOME键的时候会执行onStop,重新回到程序会执行这个方法
*/
@Override
protected void onRestart() {
super.onRestart();
Log.v(TAG, "onRestart");
}
/**
* 在onCreate,onRestart后面执行
*/
@Override
protected void onStart() {
super.onStart();
Log.v(TAG, "onStart");
}
/**
* 在onStart后面执行,执行这个方法后这个Activity就处于全部Activity堆栈的最上面
* 进入用户可见可操作的状态
*/
@Override
protected void onResume() {
super.onResume();
Log.v(TAG, "onResume");
}
/**
* 当其他Activity启动时这个方法会执行
* 按HOME和BACK都会执行这个方法
* 最好在这个方法中提交或者保存数据,因为很有可能再也不会回到这个activity中。
* 这个方法最好不要执行太长时间,因为下个activity开始执行前会等待这个方法返回。
*/
@Override
protected void onPause() {
super.onPause();
Log.v(TAG, "onPause");
}
/**
* activity很久没被显示,要被销毁,系统资源缺乏,都会调用这个方法
* 按HOME和BACK都会执行这个方法
*/
@Override
protected void onStop() {
super.onStop();
Log.v(TAG, "onStop");
}
/**
* 调用finish方法,或者系统回收资源时调用
*/
@Override
protected void onDestroy() {
super.onDestroy();
Log.v(TAG, "onDestroy");
}
}
弹出对话框:
打开程序,启动a,点击a,启动AlertDialog,按返回键从AlertDialog返回。
a经历的过程是:
onCreate->onStart->onResume
当启动和退出Dialog时,Activity的状态始终未变,可见,Dialog实际上属于Acitivity内部的界面,不会影响Acitivty的生命周期。
点击back键:
onPause->onStop->onDestroy->
onCreate->onStart->onResume
点击锁屏键
landscape 是屏幕横向,
portrait 是屏幕纵向 。
通过android:screenOrientation属性设置界面的横竖向
1、 在清单文件中指定了屏幕方向,默认竖向(屏幕方向没有改变时),则Activity在锁屏和开启屏幕的时候执行的方法和顺序是:
onPause--->onStop--->
onRestart--->
onStart--->onResume
2、在清单文件中没有对屏幕进行设置(屏幕方向可以发生改变),则Activity在锁屏时候执行的方法和顺序是:
onPause--->onStop--->onDestory--->
onCreate--->onStart--->onResume--->
onPause
销毁之后又新建且处于pause状态。
在开启屏幕的时候,Activity执行的方法及顺序是:
onResume--->
onPause--->onStop--->onDestory--->
onCreate--->onStart--->onResume
对于这种,锁屏后再次开启屏幕会销毁两次,重建两次。
解决办法:在清单文件里activity标签下配置
Android:configChanges="orientation|screenSize"
注意application标签下配置不起作用。
点击home键:
onPause->onStop->
onRestart->
onStart->onResume
启动了另一个Activity:
1、有两个Activity(a和b),一开始显示a,然后由a启动b,然后在由b回到a,这时候a的生命过程应该是怎么样的呢(a被b完全遮盖)?
a经历的过程为
onCreate->onStart->onResume->
onPause->onStop->
onRestart->
onStart->onResume
这个过程说明了图中,如果Activity完全被其他界面遮挡时,进入后台,并没有完全销毁,而是停留在onStop状态,当再次进入a时,onRestart->onStart->onResume,又重新恢复。
2、有两个Activity(a和b),一开始显示a,然后由a启动b,然后在由b回到a,不过此时a被b部分遮盖(比如给b添加个对话框主题 android:theme=”@android:style/Theme.Dialog”)
a经历的过程是:
onCreate->onStart->onResume->
onPause->
onResume
所以当Activity被部分遮挡时,Activity进入onPause,并没有进入onStop,从Activity2返回后,执行了onResume
屏幕方向旋转
MiniSdkVersion大于等于 13 时候:
android:configChanges=”orientation” 或者 android:configChanges=”orientation|keyboardHidden”
重新调用各个生命周期
MiniSdkVersion小于 13 时候:
(1)不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
(2)设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
(3)设置Activity的
android:configChanges="orientation|keyboardHidden"
时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
屏幕切换避免,重走Activity生命周期
从上面屏幕切换生命周期可以看出每次切换都在重新创建,为了不必要的麻烦比如视频播放屏幕旋转等,避免重走生命周期就是一个比较好的解决方案
(1)android 2.3之前的版本
android:configChanges="orientation|keyboardHidden"
(2)android 3.0之后的版本
android:configChanges="orientation|screenSize"
示例:
<activity android:name=".MainActivity"
android:screenOrientation="sensor"
android:configChanges="orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
参考:
屏幕方向 是对Activity而言的,所以你可以在AndroidManifest.xml 文件中,通过 标记的screenOrientation 属性进行设定。
例如:
<activity
android:name=".SketchpadActivity"
android:screenOrientation="landscape"/><!--让该Activity总是显示为横屏-->
screenOrientations属性共有7中可选值(常量定义在 android.content.pm.ActivityInfo类中):
1.landscape:横屏(风景照),显示时宽度大于高度;
2.portrait:竖屏(肖像照), 显示时高度大于宽度;
3.user:用户当前的首选方向;
4.behind:继承Activity堆栈中当前Activity下面的那个Activity的方向;
5.sensor:由物理感应器决定显示方向,它取决于用户如何持有设备,当设备被旋转时方向会随之变化——在横屏与竖屏之间;
6.nosensor:忽略物理感应器——即显示方向与物理感应器无关,不管用户如何旋转设备显示方向都不会随着改变(“unspecified”设置除外);
7.unspecified:未指定,此为默认值,由Android系统自己选择适当的方向,选择策略视具体设备的配置情况而定,因此不同的设备会有不同的方向选择;
以上配置值会反映在Activity.getRequestedOrientation()方法的返回值中,与之对应的setRequestedOrientation()方法可以通过API的方式动态改变该属性的值。