Activity生命周期

onCreate():当我们点击Activity时,系统会调用activity的onCreate()方法,在这个方法中我们会初始化当前activity的布局

onStart():在onCreate()方法执行完成后,activity会执行onStart()方法,此时当前的activity是用户可见状态,但没有焦点,与用户不能交互,一般可在当前方法做一些动画的初始化操作。

onResume():在onStart()方法执行完成之后,此时activity会进入onResume()方法中,当前activity状态属于运行状态 (Running),可以与用户进行交互。

onPause():当另外一个activity覆盖当前的acitivty时,此时当前activity会进入到onPause()方法中,当前activity仍然是可见的,但不能与用户进行交互。

onStop():在onPause()方法执行完成之后,activity会进入onStop()方法中,此时activity对用户是不可见的,在系统内存紧张的情况下,该activity有可能会被系统进行回收。所以一般在当前方法可做资源回收。

onDestory():在onStop()方法完成之后,此时activity进入到onDestory()方法中,结束当前activity

onRestart():在用户按下home键之后,再次进入到当前activity的时候会调用onRestart()。该动作的调用顺序是onPause()->onStop()->onRestart()->onStart()->onResume()

 

1、一个 A Activity 跳转到一个 B Activity中,生命周期的走动为A:onPause--onStop  B:onCreate--onStart--OnResume

2、此时再点击Back返回时,生命周期的走动为B:onPause--onStop--onSaveInstanceState--onDestory  A:onRestart--onStart--OnResume

3、如果A Activity是透明的,生命周期的走动为:

开始运行程序:A onCreate--A onStart--A OnResume

点击跳转:A onPause--B onCreate--B onStart--B onResume,因为是透明主题,用户可见,没有执行onStop()方法

按下返回键:B onPause--B onStop--B onDestory--A onResume,A是透明主题,没有执行onRestart()、onStart(),而是执行了onResume(),因为A Activity已经创建,只是由用户不可见到用户可见,所以只执行了onResume()。

4、如果B是一个Dialog,A Activity的生命周期转变为onPause状态,A Activity失去焦点,被一个新的非全屏的Activity 或者一个透明的Activity(如弹窗dialog)被放置在栈顶,此时的状态叫做暂停状态(Paused)。

 

onSaveInstanceState

Activity中的onSaveInstanceState()并不是生命周期方法,其不同于 onCreate()onPause()等生命周期方法,并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)系统需要销毁一个Activity时,onSaveInstanceState()则会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。

调用onSaveInstanceState()方法的情景:

1、用户按下home键时

2、长按home键或者按下菜单键时

3、手机息屏时

4FirstActivity启动SecondActivityFirstActivity就会调用,也就是说打开新Activity时,原Activity就会调用

5、默认情况下横竖屏切换时,当竖屏切换到横屏时,系统会销毁竖屏Activity然后创建横屏的Activity,所以竖屏被销毁时,该方法就会被调用。

 

onConfigurationChanged

onConfigurationChanged事件是在改变屏幕方向、弹出软件盘或者隐藏软键盘时,不再去执行onCreate()方法,而是直接执行onConfigurationChanged()。有的时候,当横、竖屏转换时,程序会报错或者终止,就是因为重新执行了onCreate()方法,导致系统崩溃。

按照Activity的生命周期,改变屏幕方向等事件发生时,都会去执行一次onCreate()方法,而onCreate()方法通常会在显示之前做一些初始化工作,这就有可能造成重复的初始化,降低程序效率是必然的了,而且更有可能因为重复的初始化而导致数据的丢失。可以通过监测onConfigurationChanged事件来解决这个问题,我们要在当前的activity捕获这个事件,需要做以下这么几件事情。

1、权限声明:

<uses-permission Android:name="android.permission.CHANGE_CONFIGURATION">
</uses-permission>

2、声明activity要捕获的事件类型

<activity android:name=".MainActivity"
    android:label="@string/app_name"
    android:configChanges="orientation|keyboard|screenSize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

这里一定要声明android:configChanges属性,该属性规定了我们可以在程序中捕获到的事件类型,多个事件类型用 | 分隔。如果这里没有orientation,那么我们在程序中是无法捕获到屏幕改变的事件的。

3、重写activity中的onConfigurationChanged()方法

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if(newConfig.orientation==Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(MainActivity.this,"现在是竖屏", Toast.LENGTH_SHORT).show();
    }
    if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
        Toast.makeText(MainActivity.this,"现在是横屏", Toast.LENGTH_SHORT).show();
    }
}

当横竖屏切换时,会在屏幕上显示Toast内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值