【Android】Activity 生命周期具体解释
与其它编程模式不同,android中的Activity没有main()函数。我们无法决定Activity的创建和销毁过程,Activiy的创建和销毁(即生命周期)由系统完毕,系统会在Activity的生命周期的各个阶段回调Activity对应的成员函数。
假设你想在Activity的某个生命周期阶段完毕一些事情,你要做的就是重写(Override)对应的生命周期回调函数,并在该函数中完毕对应的任务。Activity的生命周期函数有onCreate()、onStarted()、onResumed()、onPaused()、onStop()、onDestroy()、onRestart()。
以下是Activiy的生命周期金字塔。当我们第一次启动App时。在AndroidManifest.xml中指定为android.intent.action.MAIN的Acivity实例被创建。该Activity实例的onCreate()、onStart()、onResume()生命周期方法被依次调用。Activity进入Resumed状态。在Resumed状态下Activity出如今屏幕上成为当前活跃的Activity。当按下手机的HOME键。Activity的onPause()和onStopped()生命周期函数被依次调用。Activity进入Stopped状态,此时假设再次打开APP,Activity的onRestart()和onStart()生命周期函数被依次调用,假设在Stoppped状态下,App被主动关闭或系统因为资源不足而导致关闭,Activity的onDestroy()生命周期函数会被调用。
图 1 Activity生命周期金字塔
以下结合代码来看看上面的过程:
package com.example.TestActiviyLifecycle;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MyActivity extends Activity {
private static final String TAG = "com.example.TestActiviyLifecycle";
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(TAG, "onCreate() called");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart() called");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart() called");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume() called");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause() called");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop() called");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy() called");
}
}
启动APP
Logcat输出日志:
按HOME键后再打开APP
按HOME键后。Logcat输出日志:
接着再次进入APP。Logcat输出日志:
横屏、竖屏切换
竖屏模式下打开APP后(此时Activity处于Resumed状态),开启横屏竖屏切换,将手机切换至横屏模式,Logcat输出日志:
可见进行横屏和竖屏切换时,Activity被销毁并重建。
数据保存与恢复
Activity实例从Resumed状态进入Destroyed状态时,其成员函数onSaveInstanceState(Bundle)会被调用,在该函数中你能够将须要保存的数据存储在Bundle对象中。当该Activity随后被重建时,该Bundle对象会被传递给回调函数onCreate(Bundle)和onRestoreInstanceState(Bundle)函数,你能够从Bundle对象中取出数据重建Activity。
图 2 Activity中数据保存与恢复
在上面的Activiy中加入一个EditText,例如以下:
<?xml version="1.0" encoding="utf-8"?
>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<EditText
android:id="@+id/edittext_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
打包执行APP。在EditText中输入文字后,然后旋转屏幕。EditText中内容丢失了。
为解决上面问题,须要对EditText中的数据进行保存。并在Activity重建时恢复数据,在上面Activity中加入以下代码:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
TextView textView = (TextView)findViewById(R.id.edittext_text);
outState.putString(EXTRA_TEXT, textView.getText().toString());
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String text = savedInstanceState.getString(EXTRA_TEXT);
TextView textView = (TextView)findViewById(R.id.edittext_text);
textView.setText(text);
}
Activity的成员函数onSaveInstanceState()会在Activity进入Stopped状态之前被调用,因此在该函数中获取并保存文本输入框中的数据到Bundle中(用于保存Key-Value的数据结构)。
onRestoreInstanceState()会在Activity重建时被调用。而且将该Activity上一次保存在Bundle中的数据传给该函数。能够从输入參数中获取上一次保存的数据并恢复。
如今在竖屏模式下输入内容后。旋转屏幕EditText中的内容依旧存在。
參考:
[1]Google Android 官方文档
【Android】Activity 生命周期具体解释的更多相关文章
- android --Activity生命周期具体解释
一. 再探Activity生命周期 为了研究activity的生命周期,简单測试代码例如以下. package com.example.testactivity; import android.app ...
- 深入剖析Android四大组件(一)——Activity生命周期具体解释
1.管理Activity的生命周期 不管是正在执行的Activity还是没有执行的Activity,它们都接受Android的框架管理,这使得Activity处于不同的生命周期. ①Activity的 ...
- [转]: 两分钟彻底让你明白Android Activity生命周期(图文)!
转自:http://blog.csdn.net/android_tutor/article/details/5772285 大家好,今天给大家详解一下Android中Activity的生命周期,我在前 ...
- Android Activity生命周期详讲
管理 Activity 生命周期 通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要. Activity 的生命周期会直接受到 Activity 与其他 Activit ...
- Android Activity生命周期
从android api文档摘抄出来的activity生命周期图如下: Activity有如下四种状态 a.活动状态 activity处于屏幕前台,获取到了焦点可以和用户进行交互,同一时刻只有一个a ...
- android Activity生命周期(设备旋转、数据恢复等)与启动模式
1.Activity生命周期 接下来将介绍 Android Activity(四大组件之一) 的生命周期, 包含运行.暂停和停止三种状态,onCreate.onStart.onResume.o ...
- Android Activity生命周期以及Fragment生命周期的区别与分析
Android Fragment生命周期图: Activity生命周期图: 对照图: Fragment生命周期分析: 1. 当一个fragment被创建的时候,它会经历以下状态. onAttach() ...
- Android Activity 生命周期详解
学习android开发这么久对于activity的生命周期还没有仔细思考过,所以,我大致的把这些东西整理一下,希望通过这使自己理解的更透彻点吧! 首先看一下Activity生命周期图和它的的四个阶段 ...
- xamarin Android activity生命周期详解
学Xamarin我为什么要写这样一篇关于Android 的activity生命周期的文章 已经学Xamarin android有一段时间了,现在想起当初Xamarin也走了不少的弯路.当然Xamari ...
随机推荐
- BeanFactoryAware和BeanNameAware
实现 BeanFactoryAware 接口的 bean 可以直接访问 Spring 容器,被容器创建以后,它会拥有一个指向 Spring 容器的引用. BeanFactoryAware 接口只有一个 ...
- 【51Nod 1756】【算法马拉松 23】谷歌的恐龙
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1765 设答案为\(X\). 则\[X=\frac{m}{n}\times ...
- [APIO2018]铁人两项 --- 圆方树
[APIO2018] 铁人两项 题目大意: 给定一张图,问有多少三元组(a,b,c)(a,b,c 互不相等)满足存在一条点不重复的以a为起点,经过b,终点为c的路径 如果你不会圆方树 ------- ...
- [BZOJ4873][六省联考2017]寿司餐厅(最大权闭合子图)
4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 490 Solved: 350[Submit][Status ...
- JZYZOJ1525 HAOI2012道路 堆优化的dijkstra+pair
From Tyvj Guest ☆[haoi2012]道路 描述 Description C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当 ...
- JavaScript设计模式与开发实践——读书笔记1.高阶函数(上)
说来惭愧,4个多月未更新了.4月份以后就开始忙起来了,论文.毕设.毕业旅行等七七八八的事情占据了很多时间,毕业之后开始忙碌的工作,这期间一直想写博客,但是一直没能静下心写.这段时间在看<Java ...
- UESTC 2015dp专题 G 邱老师玩游戏 背包dp
邱老师玩游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/65 Descr ...
- c语言把mysql数据库语句和变量封装为一个语句
我有一个语句 sql = "insert into talbe_name values(name,age)" 其中name和age两个变量根据外面的输入来确定,有两种方法 1: ...
- MySQL遇到的一个卡库问题及对update的学习
近日遇到个卡库的问题,环境是MySQL5.5.12,报错信息如下 ) and was aborted. There is a chan ce that your master is inconsist ...
- StringFormat
public class StringFormatDemo { public static void main(String[] args) { String str = null; str = St ...