android-Activity生命周期

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锁屏状态下的生命周期

Activity的生命周期,BACK键和HOME键生命周期

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的方式动态改变该属性的值。

参考:

详解Android中的屏幕方向

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值