Activity的生命周期方法
2016-05-24 16:21
609 查看
Activity负责UI元素的加载与页面之间的跳转,代表了一个页面单元,每个Activity都有声明周期,在不同的阶段会调用不同的的生命周期方法。Activity的生命周期有如下几个:
上图是一个Activity声明周期方法执行的流程图
OnCreate() : 我们在创建继承自Activity的类时都会默认生成这个函数,它会在Activity第一次被创建的时候调用,通常会在这个函数中完成Activity的初始化操作,如设置布局,初始化视图,绑定事件等。
OnStart():这个函数在Activity的OnCreate()之后被调用,此时得Activity还处在不可见状态,他的下一个状态就是Activity变得可见的时候,也就是这个函数在Activity可见之前被调用。
OnResume():这个函数在Activity变为可见时被调用,执行完OnResume()之后,Activity就会请求AMS渲染他所管理的视图,此时的Activity一定位于栈的顶端,并且处于运行状态。
OnPause():这个函数在系统准备去启动或者回复另外一个Activity时调用,也就是在Activity即将从可见状态变为不可见时。我们通常会在这个函数中将一些消耗CPU的资源释放掉,以及保存一些相关的数据。
OnStop():这个函数在Activity完全不可见时调用,他和OnPause()函数的主要区别在于,如果新启动的Activity是一个对话框式的Activity,那么OnPause()函数会得到执行,而OnStop()函数并不会执行
OnDestroy():这个函数在Activity被销毁之前调用,之后Activity的状态将变为销毁状态。
OnRestart():这个函数在Activity由停止状态重新变为运行状态时调用,也就是Activity被重新启动了。
下面我们来看一下具体的 示例
假设我们有2个Activity
代码如下:
MainActivity.java
SecondActivity.java
其中MainActiviy中有一个按钮点击会跳转到SecondActivity
我们先看一个最为普通的操作流程:我们启动MainActivity然后按back键
结果为:
再来看一个操作流程:我们启动MainActivity然后按Home键结果为:
这里可以看到它执行了onSaveInstanceState,用来保存数据
我们来看一下,怎么在onSaveInstanceState利用bundle保存数据
这里需要说明onSaveInstanceState的执行时机为:当activivity可能会引系统内存不足销毁时执行。
有一下几种时机:
1、用户按下home键
2、锁屏
3、从Activity A 跳转Activity B
4、屏幕切换
onRestoreInstanceState的调用时机则为:OnSaveInstanceSate被调用的前提下,Activity确实销毁了,之后重新创建会执行。
另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。
我们再来看一个流程:正常情况下从MainActivity跳转到SecondActivity执行顺序为:
可以看到会先执行 MainActivity的onPause() 然后执行 SecondActivity的 onStart
、OnResume ,最后执行ManActivity的 onSaveInstanceState、onStop
这时就完全启动了 SecondActivity。
然后我们接着 点击返回按钮 返回到MainActiviy来看看:
这时我们看到,SecondActivity先执行 onPause()、然后MainAcitiviy从执行onRestart、onStart、onResume、回到栈顶。之后 SecondActivity执行OnStop、onDestroy销毁。
最后我们来看一种情况:当SecondActiviy是窗口Activity时,我们在Manifest中给SecondActivity添加属性
然后我们来重新启动app,点击按钮进行跳转
结果如下:
可以看到正如文章开头所述:如果SecondActivity是窗口Activity,那么MainActivity不会执行onStop.接着我们按返回键,返回MainActiviy
可以看到MainActiviy直接执行了OnResume。并没有执行onRestart()和onStart()
上图是一个Activity声明周期方法执行的流程图
OnCreate() : 我们在创建继承自Activity的类时都会默认生成这个函数,它会在Activity第一次被创建的时候调用,通常会在这个函数中完成Activity的初始化操作,如设置布局,初始化视图,绑定事件等。
OnStart():这个函数在Activity的OnCreate()之后被调用,此时得Activity还处在不可见状态,他的下一个状态就是Activity变得可见的时候,也就是这个函数在Activity可见之前被调用。
OnResume():这个函数在Activity变为可见时被调用,执行完OnResume()之后,Activity就会请求AMS渲染他所管理的视图,此时的Activity一定位于栈的顶端,并且处于运行状态。
OnPause():这个函数在系统准备去启动或者回复另外一个Activity时调用,也就是在Activity即将从可见状态变为不可见时。我们通常会在这个函数中将一些消耗CPU的资源释放掉,以及保存一些相关的数据。
OnStop():这个函数在Activity完全不可见时调用,他和OnPause()函数的主要区别在于,如果新启动的Activity是一个对话框式的Activity,那么OnPause()函数会得到执行,而OnStop()函数并不会执行
OnDestroy():这个函数在Activity被销毁之前调用,之后Activity的状态将变为销毁状态。
OnRestart():这个函数在Activity由停止状态重新变为运行状态时调用,也就是Activity被重新启动了。
下面我们来看一下具体的 示例
假设我们有2个Activity
代码如下:
MainActivity.java
package com.simple.myapplication; import android.content.Intent; import android.content.res.Configuration; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(MainActivity.this,SecondActivity.class)); } }); Log.i(TAG, "onCreate: "); } @Override protected void onStart() { super.onStart(); Log.i(TAG, "onStart: "); } @Override protected void onRestart() { super.onRestart(); Log.i(TAG, "onRestart: "); } @Override protected void onResume() { super.onResume(); Log.i(TAG, "onResume: "); } @Override protected void onStop() { super.onStop(); Log.i(TAG, "onStop: "); } @Override protected void onPause() { super.onPause(); Log.i(TAG, "onPause: "); } @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "onDestroy: "); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.i(TAG, "onRestoreInstanceState: "); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.i(TAG, "onSaveInstanceState: "); } }
SecondActivity.java
package com.simple.myapplication; import android.os.Bundle; import android.os.PersistableBundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; /** * Created by blueberry on 2016/5/24. */ public class SecondActivity extends AppCompatActivity{ private static final String TAG = "SecondActivity"; @Override public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); Log.i(TAG, "onCreate: "); } @Override protected void onStart() { super.onStart(); Log.i(TAG, "onStart: "); } @Override protected void onRestart() { super.onRestart(); Log.i(TAG, "onRestart: "); } @Override protected void onResume() { super.onResume(); Log.i(TAG, "onResume: "); } @Override protected void onPause() { super.onPause(); Log.i(TAG, "onPause: "); } @Override protected void onStop() { super.onStop(); Log.i(TAG, "onStop: "); } @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "onDestroy: "); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.i(TAG, "onSaveInstanceState: "); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.i(TAG, "onRestoreInstanceState: "); } }
其中MainActiviy中有一个按钮点击会跳转到SecondActivity
我们先看一个最为普通的操作流程:我们启动MainActivity然后按back键
结果为:
/com.simple.myapplication I/MainActivity: onCreate: /com.simple.myapplication I/MainActivity: onStart: /com.simple.myapplication I/MainActivity: onResume: 按下back键; /com.simple.myapplication I/MainActivity: onPause: /com.simple.myapplication I/MainActivity: onStop: /com.simple.myapplication I/MainActivity: onDestroy:
再来看一个操作流程:我们启动MainActivity然后按Home键结果为:
com.simple.myapplication I/MainActivity: onCreate: com.simple.myapplication I/MainActivity: onStart: com.simple.myapplication I/MainActivity: onResume: 按下home键之后: com.simple.myapplication I/MainActivity: onPause: com.simple.myapplication I/MainActivity: onSaveInstanceState: com.simple.myapplication I/MainActivity: onStop:
这里可以看到它执行了onSaveInstanceState,用来保存数据
我们来看一下,怎么在onSaveInstanceState利用bundle保存数据
@Override protected void onSaveInstanceState(Bundle outState) { outState.putInt("key",1); super.onSaveInstanceState(outState); Log.i(TAG, "onSaveInstanceState: "); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { int i = savedInstanceState.getInt("key"); super.onRestoreInstanceState(savedInstanceState); Log.i(TAG, "onRestoreInstanceState: "); }
这里需要说明onSaveInstanceState的执行时机为:当activivity可能会引系统内存不足销毁时执行。
有一下几种时机:
1、用户按下home键
2、锁屏
3、从Activity A 跳转Activity B
4、屏幕切换
onRestoreInstanceState的调用时机则为:OnSaveInstanceSate被调用的前提下,Activity确实销毁了,之后重新创建会执行。
另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。
我们再来看一个流程:正常情况下从MainActivity跳转到SecondActivity执行顺序为:
com.simple.myapplication I/MainActivity: onCreate: com.simple.myapplication I/MainActivity: onStart: com.simple.myapplication I/MainActivity: onResume: 点击按钮后 com.simple.myapplication I/MainActivity: onPause: com.simple.myapplication I/SecondActivity: onStart: com.simple.myapplication I/SecondActivity: onResume: com.simple.myapplication I/MainActivity: onSaveInstanceState: com.simple.myapplication I/MainActivity: onStop:
可以看到会先执行 MainActivity的onPause() 然后执行 SecondActivity的 onStart
、OnResume ,最后执行ManActivity的 onSaveInstanceState、onStop
这时就完全启动了 SecondActivity。
然后我们接着 点击返回按钮 返回到MainActiviy来看看:
com.simple.myapplication I/SecondActivity: onPause: com.simple.myapplication I/MainActivity: onRestart: com.simple.myapplication I/MainActivity: onStart: com.simple.myapplication I/MainActivity: onResume: com.simple.myapplication I/SecondActivity: onStop: com.simple.myapplication I/SecondActivity: onDestroy:
这时我们看到,SecondActivity先执行 onPause()、然后MainAcitiviy从执行onRestart、onStart、onResume、回到栈顶。之后 SecondActivity执行OnStop、onDestroy销毁。
最后我们来看一种情况:当SecondActiviy是窗口Activity时,我们在Manifest中给SecondActivity添加属性
<activity android:name=".SecondActivity" android:theme="@style/Theme.AppCompat.DayNight.Dialog" > </activity>
然后我们来重新启动app,点击按钮进行跳转
结果如下:
com.simple.myapplication I/MainActivity: onCreate: com.simple.myapplication I/MainActivity: onStart: com.simple.myapplication I/MainActivity: onResume: 点击按钮; com.simple.myapplication I/MainActivity: onPause: com.simple.myapplication I/SecondActivity: onStart: com.simple.myapplication I/SecondActivity: onResume: com.simple.myapplication I/MainActivity: onSaveInstanceState:
可以看到正如文章开头所述:如果SecondActivity是窗口Activity,那么MainActivity不会执行onStop.接着我们按返回键,返回MainActiviy
com.simple.myapplication I/SecondActivity: onPause: com.simple.myapplication I/MainActivity: onResume: com.simple.myapplication I/SecondActivity: onStop: com.simple.myapplication I/SecondActivity: onDestroy:
可以看到MainActiviy直接执行了OnResume。并没有执行onRestart()和onStart()
相关文章推荐
- Servlet3.1应用生命周期事件 (转载)
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件