Android教程 -06 Activity的生命周期
本篇播客我们重点介绍下如下知识点:
- 程序启动原理
- Activity生命周期
Activity销毁与创建
视频建议采用超清模式观看, 欢迎点击订阅我的优酷
程序启动原理
当用户从主界面点击程序图标时,系统会调用app中被声明为”launcher” (or “main”) activity中的onCreate()方法。这个Activity被用来当作程序的主要进入点。
我们需要在AndroidManifest.xml中声明主Activity,添加如下的意图过滤器
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Activity生命周期
Activity几种状态
Resumed:该状态下,activity处在前台,用户可以与它进行交互。(通常也被理解为”running” 状态)
Paused:该状态下,activity的部分被另外一个activity所遮盖:另外的activity来到前台,但是半透明的,不会覆盖整个屏幕。被暂停的activity不再接受用户的输入且不再执行任何代码。
Stopped:该状态下, activity完全被隐藏,对用户不可见。可以认为是在后台。当stopped, activity实例与它的所有状态信息(如成员变量等)都会被保留,但activity不能执行任何代码。
其它状态 (Created与Started)都是短暂的,系统快速的执行那些回调函数并通过执行下一阶段的回调函数移动到下一个状态。也就是说,在系统调用onCreate(), 之后会迅速调用onStart(), 之后再迅速执行onResume()。以上就是基本的activity生命周期。
生命周期的方法
onCreate() 当Activity 创建的时候调用
onStart() 可见的时候调用
onResume() 获取焦点的时候调用
onPause() 失去焦点的时候调用
onStop() 不可见的时候调用
onDestroy() 销毁的时候调用
onRestart() 重新可见的时候调用
Activity销毁时保存数据
当activity异常退出的时候会调用onSaveInstanceState() 保存数据,当重新打开的时候会调用onRestoreInstanceState()
// 当Activity异常退出的时候调用
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.e(TAG, "onSaveInstanceState");
//保存了临时的数据
outState.putString("key","value");
}
// 异常退出重新打开的时候调用
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.e(TAG, "onRestoreInstanceState");
// 取出临时的数据
String value=savedInstanceState.getString("key");
Toast.makeText(getApplicationContext(),value,Toast.LENGTH_SHORT).show();
}
其实onRestoreInstanceState可以不用写,当程序异常退出时,有保存的数据,我们还可以在onCreate方法中取出来
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//如果之前保存过数据, 取出来
if(savedInstanceState!=null){
String value=savedInstanceState.getString("key");
Toast.makeText(getApplicationContext(),value,Toast.LENGTH_SHORT).show();
}
Log.e(TAG, "onCreate");
setContentView(R.layout.activity_life);
}
默认情况下,当手机横竖屏切换的时候,首先会销毁Activity,然后重新创建Activity,这时候Activity就被认为异常退出。
怎么保证Activity横竖屏切换的时候不会销毁重新创建呢?
视频建议采用超清模式观看, 欢迎点击订阅我的优酷
我们需要在清单文件中对Activity进行配置,添加了android:configChanges:
<activity android:name=".LifeActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
>
</activity>
对android:configChanges属性,一般认为有以下几点:
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次,测试的时候发现在高版本并不会调用多次。
2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
但是,自从Android 3.2(API 13),在设置Activity的android:configChanges=”orientation|keyboardHidden”后,还是一样 会重新调用各个生命周期的。因为screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置”orientation”, 你还必须设置”ScreenSize”。
如果当前你的程序不允许横竖屏切换,可以加上android:screenOrientation配置,其中portrait是锁定竖屏,landscape是横屏
<activity android:name=".LifeActivity"
android:screenOrientation="portrait"
>
</activity>
视频建议采用超清模式观看, 欢迎点击订阅我的优酷
最后建议
我们学习了Activity生命周期和销毁保存数据的一些知识,我们要合理使用这些知识。
- 使用app的时候,不会因为有来电通话或者切换到其他app而导致程序crash。
- 用户没有激活某个组件时不会消耗宝贵的系统资源。
- 离开app并且一段时间后返回,不会丢失用户的使用进度。
- 设备发生屏幕旋转时不会crash或者丢失用户的使用进度
Android教程 -06 Activity的生命周期的更多相关文章
- Android组件系列----Activity的生命周期
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- Android开发之Activity的生命周期以及加载模式
本篇博客就来好好的搞一下Activity的生命周期,如果搞过iOS的小伙伴的话,Activity的生命周期和iOS中ViewController的生命周期非常类似.生命周期,并不难理解.一个人的生命周 ...
- android 基础02 - Activity 的生命周期及状态
返回栈 Android 中的 Activity 是可以层叠的,当我们启动一个新的 Activity 时,就会覆盖在原有的 Activity 之上, 点击 Back 会销毁当前 Activity,下面的 ...
- Android Studio 之 Activity 的生命周期
翻转屏幕,会重新加载Activity package com.example.activitylivecycle; import android.os.Bundle; import android.u ...
- Android学习笔记----Activity的生命周期图示
转载,一目了然.
- Android Activity的生命周期
一.为什么要了解Activity的生命周期 activity is directly affected by its association withother activities, its tas ...
- Android开发艺术1之Activity的生命周期
作为<Android开发艺术探索>这本书的第一篇博客,我就多说几句.本系列博客旨在对书中相关内容进行解读,简化,提供一个入门到提高的流程.不敢说书评,也不能说教程,只希望对有些人有帮助就好 ...
- android开发艺术探索学习 之 结合Activity的生命周期了解Activity的LaunchMode
转载请标明出处: http://blog.csdn.net/lxk_1993/article/details/50749728 本文出自:[lxk_1993的博客]: 首先还是先介绍下Activity ...
- Android SDK上手指南:Activity与生命周期
Android SDK上手指南:Activity与生命周期 2013-12-26 15:26 核子可乐译 51CTO 字号:T | T Activity生命周期并不仅仅在用户运行应用程序之后才开始生效 ...
随机推荐
- day37 04-Hibernate二级缓存:list和iterate方法比较
get()和load()方法既可以向一级缓存区放数据,也可以向二级缓存区放数据.这是查询一个的情况.要是查询所有呢?注意, // 查询所有.Query接口的list()方法. // list()方法会 ...
- javascript之键盘事件的方法
键盘事件包含onkeydown.onkeypress和onkeyup这三个事件 事件初始化 function keyDown(){} document.onkeydown = keyDown; //论 ...
- WCF 服务
1.代码 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Seriali ...
- LintCode刷题笔记-- BackpackII
标记: 动态规划 问题描述: Given n items with size Ai, an integer m denotes the size of a backpack. How full you ...
- FatMouse' Trade (贪心)
#include <iostream> #include <stdio.h> #include <cstring> #include <cmath> # ...
- c中函数指针和回调函数
函数指针: 指向函数的指针.(定义的函数会分配一块内存,同变量一样存在首地址)示例如下: int Func(int x); /*声明一个函数*/ int (*p) (int x); /*定义一个函数指 ...
- small标签
<small> 标签将旁注 (side comments) 呈现为小型文本. 免责声明.注意事项.法律限制或版权声明的特征通常都是小型文本.小型文本有时也用于新闻来源.许可要求. 对于由 ...
- RGBA(0,0,0,0)调色
前三个值(红绿蓝)的范围为0到255之间的整数或者0%到100%之间的百分数.这些值描述了红绿蓝三原色在预期色彩中的量. 第四个值,alpha值,制定了色彩的透明度/不透明度,它的范围为0.0到1.0 ...
- Spring_Aop_(二)
切面的优先级 @Order(1)注解 指定切面的优先级,值越小优先级越高 @Order(1) @Aspect @Component public class VlidationAspect { @Be ...
- oracle水线的定义
1.水线定义了表的数据在一个BLOCK中所达到的最高的位置. 2.当有新的记录插入,水线增高 3.当删除记录时,水线不回落 4.减少查询量