深入了解Activity-生命周期
一 介绍
Activity是android中使用最为频繁的组件,在官方文档中是这样描述的:An activity is a single, focused thing that the user can do. Almost all activities interact with the user, so the Activity class takes care of creating a window for you in which you can place your UI with setContentView(View).
一个activity就是一个单一的可以与用户进行交互的东西,或者说界面,几乎所有的Activity都要和用户进行交互,Activtity的重要性就很明显了,所有每一个Android童鞋都应该掌握它。今天了解的是Ativity的生命周期。
二 正常情况下的生命周期
正常情况下的生命周期就是我们使用中,Activity经过的生命周期.下面是官网給的Activity生命周期的图,使用它可以帮助我们更直观的理解Activity的生命周期
正常情况下,Activity会经历如下声明周期:
1 onCreate : 该方法表示Activity正在被创建,在这个方法里可以做一些初始化的工作,setContentView去加载布局,通过findViewById获得要操作的控件,以及初始化数据等操作。
2 onReStart : 表示Activity正在重新启动,当Activity从不可见变为可见状态的时候,该方法就会被调用,比如你打开了一个新的Activity,此时当前的Activity就会执行onPause和onStop方法,接着当我们按返回键的时候,就会调用此方法.
3 onStart : 表示Activity正在被启动,此时Activity已经可见了,只是没有出现在前台界面,不能和用户进行交互,比如点击事件之类的
4 onResume : 表示Activity已经可见并且可以进行用户交互。注意和onStart方法的区别
5 onPause : 表示Activity正在停止。该方法被调用的情况一般是当前Activity变为不可见状态的时候.
6 onStop : 表示Activity 即将停止。该方法被调用的情况一般是当前Activity变为不可见状态的时候.
7 onDestory : 表示Activity 即将被销毁,我们可以在这里做一些回收工作和资源释放.
三 正常情况下的生命周期例子
说了那么多,我们自己写一个例子,可以更好的理解。在android studio中新建两个Activity:MainActivity和Main2Activity(as会默认为我们创建好MainActivity )
MainActivity代码如下:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "lifecycle";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, this.getLocalClassName() + ":onCreate");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG,this.getLocalClassName()+":onRestart");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, this.getLocalClassName() + ":onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, this.getLocalClassName() + ":onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, this.getLocalClassName() + ":onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, this.getLocalClassName() + ":onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, this.getLocalClassName() + ":onDestroy");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void click(View view) {
startActivity(new Intent(this,Main2Activity.class));
}
}
Main2Activity代码如下:
public class Main2Activity extends AppCompatActivity {
private static final String TAG = "lifecycle";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Log.d(TAG, this.getLocalClassName() + ":onCreate");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, this.getLocalClassName() + ":onRestart");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, this.getLocalClassName() + ":onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, this.getLocalClassName() + ":onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, this.getLocalClassName() + ":onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, this.getLocalClassName() + ":onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, this.getLocalClassName() + ":onDestroy");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main2, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
上面的代码很清楚了,就是重写了Activity生命周期的各个方法,然后用log打印出来。下面启动MainActivity,log日志打印如下:
可以看到我们MainActivity启动的时候经过的生命周期: onCreate ——>onStart——>onResume
我们点击toMain2按钮进入Main2Activity,log日志打印如下
可以看到log打印了MainActivity执行了onPause->onStop方法,变为不可见了,Main2Activity就和上面的情况一样了。
此时我们在Main2Activity点击回退按钮再查看log信息:
可以看到log打印了Main2Activity执行了onPause->onStop->onDestroy方法,
MainActivity由于还在任务stack中所以执行 onRestart->onStart->onResume,结合上面的图就很好理解了。
我们在MainActivity中再次点击back回退,log如下:
此时MainActivity变为不可见,最后被销毁了.onPause->onStop->onDestory
对于上面的生命周期, onCreate对应于onDestroy,创建与销毁,onStart对应onStop,表示了Activity的是否可见,而onResume对应于onPause,
这里需要注意,onStart,onStop是对应于Activity是否可见来说的,而onResume于onPause是从Activity是否位于前台来说的
注意上面的log,Main2启动之前总是Main已经执行了onPause方法之后。
四 异常情况下的生命周期
异常情况主要是指系统资源相关的配置发生了改变,或者系统内存不足Activity被杀死的情况
系统配置发生改变最常见的就是横竖屏切换了,默认情况下,横竖屏切换后由于系统配置发生了改变,Activity就会被重新创建,并且会多调用一个onSaveInstanceState来保存Activity的状态,Activity被重新创建后,会调用onRestoreInstanceState来恢复一下数据,我们可以根据这个方法是否被调用来判断Activity是否被重建了.这两个方法系统组哦了一些View的恢复工作,比如用户输入的数据,焦点等
五 异常情况下的生命周期的例子
在MainActivity中加入如下代码:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d(TAG, this.getLocalClassName() + ":onSaveInstanceState");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d(TAG, this.getLocalClassName() + ":onRestoreInstanceState");
}
重新启动MainActivity,然后将手机横屏显示,此时log信息如下:
可以看到的确调用了onSaveInstanceState和onRestoreInstanceState方法来保存数据和恢复数据。我们也可以在onSaveInstanceState中保存一些我们的信息,然后在onRestoreInstanceState和 onCreate中做恢复;
代码如下:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d(TAG, this.getLocalClassName() + ":onSaveInstanceState");
outState.putString("data","this is my data");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d(TAG, this.getLocalClassName() + ":onRestoreInstanceState"+"data is "+savedInstanceState.get("data"));
}
再进行横竖屏切换后发现在onRestoreInstanceState方法中log输出了data数据.
另外一种异常情况是内存不足的时候
如果我们想要系统资源发生改变以后不重新创建, 只需要在AndroidManifest.xml 中指定android:configChanges=”orientation|screenSize”
android:configChanges可配置的参数有很多,具体的意思参考官网或其他资料查看.
到这里相信大家对Activity的生命周期已经有了很好的理解了.
深入了解Activity-生命周期的更多相关文章
- [转]: 两分钟彻底让你明白Android Activity生命周期(图文)!
转自:http://blog.csdn.net/android_tutor/article/details/5772285 大家好,今天给大家详解一下Android中Activity的生命周期,我在前 ...
- Activity生命周期(深入理解)
今天看到一篇大神总结Activity的文章,内容甚为详细,特此转载http://www.cnblogs.com/lwbqqyumidi/p/3769113.html Android官方文档和其他不少资 ...
- Android Activity生命周期
从android api文档摘抄出来的activity生命周期图如下: Activity有如下四种状态 a.活动状态 activity处于屏幕前台,获取到了焦点可以和用户进行交互,同一时刻只有一个a ...
- Android Activity生命周期详讲
管理 Activity 生命周期 通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要. Activity 的生命周期会直接受到 Activity 与其他 Activit ...
- android Activity生命周期(设备旋转、数据恢复等)与启动模式
1.Activity生命周期 接下来将介绍 Android Activity(四大组件之一) 的生命周期, 包含运行.暂停和停止三种状态,onCreate.onStart.onResume.o ...
- android开发------Activity生命周期
这几天工作比较忙,基本没有什么时间更新播客了. 趁着今晚有点时间,我们来简单说一下什么是Activity生命周期和它们各阶段的特征 什么是生命周期 在还没有接触android开发的时候,听到有人说Ac ...
- 安卓activity生命周期
相信不少朋友也已经看过这个流程图了,也基本了解了Activity生命周期的几个过程,我们就来说一说这几个过程. 1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法, ...
- Activity生命周期 onCreate onResume onStop onPause (转)
Android应用开发提高系列(6)——Activity生命周期 onCreate 和 onResume 在程序启动时候都会启动, 所有有些需要在onCreate onResume中都要实现的功能,之 ...
- Android总结篇系列:Activity生命周期
Android官方文档和其他不少资料都对Activity生命周期进行了详细介绍,在结合资料和项目开发过程中遇到的问题,本文将对Activity生命周期进行一次总结. Activity是由Activit ...
- Android体系结构及activity生命周期
Android的系统架构采用了分层架构的思想,如图1所示.从上层到底层共包括四层,分别是应用程序程序层.应用框架层.系统库和Android运行时和Linux内核 Android的系统架构图 每层 ...
随机推荐
- hbase安装
HBase的安装 本篇介绍两种HBase的安装方式:本地安装方式和伪分布式安装方式. 安装的前提条件是已经成功安装了hadoop,而且hadoop的版本要和hbase的版本相匹配. 我将要安装的hba ...
- 网络拥塞控制与NS2仿真
准备工作: 1. 安装virtual box 虚拟机,并安装虚拟机增强功能,并配制共享文件夹. 共享文件夹自动挂载后的路径为/media/sf_xxx文件夹,xxx为所起的文件名. 解决virtual ...
- 超实用的JavaScript技巧及最佳实践(上)
在这篇文章中,作者将会向大家分享JavaScript开发的小技巧.最佳实践等非常实用的内容,不管你是前端开发者还是服务端开发者,都应该来看看这些小技巧,它们绝对会让你受益的. 文中所提供的代码片段都已 ...
- 超实用的8个Linux命令行性能监测工具
http://www.csdn.net/article/2012-09-17/2810047-command-line-tools-to-monitor-linux-perf 你值得拥有:25个Lin ...
- Alwayson+Replication
本文将介绍如何实现Alwayson + Replication ,通过AlwaysOn实现Publication database的高可用性,使Publication database在failove ...
- Web开发入门疑问收集(不定期更新)
bootstrap container和container-fluid的区别 原始链接 container 根据显示设备满足的最小宽度,来决定实际内容宽度,是一个根据设置内容阶梯式响应的布局. 例子: ...
- webapp项目前端总结
提纲 整体把握,从设计稿入手——技术选型 并行开发,从实现静态页面开始 前端自动化 前端js逻辑 前后端集成 小问题集合 总结 1.整体把握,从设计稿入手 —— 技术选型 新项目到手,算是运气好,设计 ...
- LeetCode——Jump Game II
Description: Given an array of non-negative integers, you are initially positioned at the first inde ...
- Python文件操作详解
Python内置了一个open()方法,用于对本地文件进行读写操作.这个功能简单.实用,属于必须掌握的基础知识. 使用open方法操作文件可以分三步走,一是打开文件,二是操作文件,三是关闭文件.下面分 ...
- 华为手机Edittext光标(cursor)颜色修改
华为手机的emui系统经常让人发出“可以可以,这很华为”的感叹 这两天在edittext部分也发生了这样的事情 正常edittext光标的颜色和宽度都说可以修改的,只需要通过xml中的 textCur ...