安卓012Activity生命周期

来源:互联网 发布:ps for mac破解版下载 编辑:程序博客网 时间:2024/06/05 17:11

直译为活动,在 Android 为一个界面


一、  【掌握】Activity  的四种状态
g Running 状态:一个新的 Activity 启动入栈后,它在屏幕最前端,处理栈的最顶端,
此时它处理可见并可和用户交互的激活状态.
Pausd状态:当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态,
此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已
经失去了焦点,故不可以与用户交互.
d Stoped 状态:当 Activity 不可见时, Activity 处理 Stoped 状态. Activity 将继
续保留在内存中保持当前的所有状态和成员信息,假设系统别的地方需要内在的话,这
时它是被回收对象的主要候选,当Activity处理Stoped状态时,一定要保存当前数据和
当前的 UI 状态,否刚一旦 Activity 退出或关闭时,当前的数据的 UI 状态就丢失了.
d Killed 状态: Activity 被杀掉以后或者被启动以前,处理 Killed 状态.这时
Activity 已从 Activity 堆栈中移除,需要重新启动才可以显示和使用
说明: Activity 的 4 种状态中,. Running 和 Pausd 是可见的 Stoped 和 Killed 是不可

见的


二、  【掌握】Activity  之间的跳转
在 Android 中,经常会有多个 Activity,而这些 Activity 之间又经常跳转,那么在 Android 口
这些 Activity 是如何跳转的呢
Intent 解决跳转的问题
使用方法
Intent intent=new Intent(MainActivity.this.OtherActivity.class);
再调用 Activity 本身的 startActivity 方法
注意,新添加的 Activity 一个要在清单文件里面注册
<activity android:name="com.example.activity.OtherActivity" ></activity>

点击跳转之后 |


三、  【掌握】Activity  的生命周期
3.1 Activity  的生命周期方法(系统调用的)
1、 onCreate(Bundle bundle) 创建并初始化时调用的
2、 onStart() 显示窗体或页面(Activity)
3、 onResume() 获取用户焦点(与用户交互)
4、 onPause() 失去用户焦点(暂停与用户交互)
5、 onStop() 关闭当前页面(处于后台运行)
6、 onRestart() 重新显示用户页面(->onStart())

7、 onDestroy() 销毁 Activity


3.2 Activity  生命周期方法执行的顺序
1、 创建时: onCreate()->onStart()->onResume()
2、 按 Home 键: onPause()->onStop()
3、 再次显示时: onRestart()->onStart()->onResume()

4、 按返回键: onPause()->onStop()->onDestroy()


3.3  两个 Activity  跳转时的生命周期方法执行的顺序
假设: MainActivity 为 A ,SecondActivity 为B
1、 A->B,它们之间的顺序:
A:onPause()->B:onCreate()->B:onStart()->B:onResume()->A:onStop()
2、在 B 页面 按返回键: 它们之间的顺序:

B:onPause()->A:onRestart()->A:onStart()->A:onResume()->B:onStop()->B:onDestroy()


3.4  横竖屏切换时,Activty  的生命周期的变化
1. 开始显示: onCreate()->onStart()->onResume()

2. 屏幕切换: onPause()->onStop()->onDestory()->onCreate()->onStart()->onResume()


3.5 Activity  的生命周期图
说明:在 Activity 中,可以根据程序的需要来重写相应的方法.通常情况下, onCreate ()方法和
onPause ()方法是最常用的方法,经常需要重写这两个方法
Activity
Starts
Activity is
shut down
onCreate()
onStart()
onResume()
onPause()
onStop()
onDestroy()
Activity is
running
另一个Activity转入
该Activity之前
Process is
killed
内存低
由用户操作返
回该Activity
该Activity以
后都不可见
该Activity再
次返回前台
该Activity再
次返回前台
onRestart()
前台生命周期
可视生命周期

完整生命周期


3.6  生命周期的优点
①当用户接一个电话或切换到另一个程序不会崩溃
②当用户后台运行程序时不会销毁有价值的系统资源
③当用户离开再返回你的应用时不会丢失用户的进程

④当手机屏幕进行横竖屏切换的时候不会崩溃或者丢掉用户的进程


四、  【掌握】Activity  之间 数据 交换
4.1  使用 Intent  传值
Intent 里面的存值方法
Intent 里面的取值方法
4.2  通过 Bundle  传递对象(对象的序列化 Serializable ) 接口)
当在一个 Activity 中启动另一个 Activity,而这些 Activity 之间又经常要交换数据,这时可以通过
Intent 来实现,因为 Intent 通常被称为是两个 Activity 之间的信使,通过将要传递的数据保存在
Intent 中,就可以将其传递到另一个 Activity 中.
在 Android 中,可以将要保存的数据存放在 Bundle 对象中,然后通过 Intent 提供的 putExtras()
方法将要携带的数据保存在 Intent 中.
说明: Bundle 是一个字符串值到各种Parcelable 类型的映射, 用于保存要携带的数
据包传递一个一个的字符
Bundle bundle = new Bundle(); // 实例化一个 Bundle 对象
bundle.putSerializable("info", info); // 将输入的基本信息保存到 Bundle 对象中
Intent intent = new Intent(MainActivity.this, ResultActivity.class);
intent.putExtras(bundle); // 将 bundle 保存到 Intent 对象中
startActivity(intent); // 启动 intent 对应的 Activity
接收:Intent intent=getIntent();  //获取 Intent 对象
Bundle bundle=intent.getExtras(); //获取传递的数据包
Info info=(Info)bundle.getSerializable("info");  //获取一个可序列化的 info 对象
Intent  为我们提供了 Bundle  里面的所有方法,为什么
要使用 Bundle  呢?思考?
练习
//计算男士标准体重
标准体重= (身高-80)*0.7);
//计算女士标准体重

标准体重=(身高-70)*0.6);


4.3  使用 Application  全局对象传值
当 APP 里面有相应的变量是启动之后永远不全改变,但在很多地方需要用到的时候,我们
可以考虑把其设置成 Application 全局对象 如我们手机的的屏幕尺寸等
具体实现方法
1,创建 Application 的子类 主要重写里面的 onCreate 方法,把要初始化的变量在
onCreate 方法里面全部初始化
2,在 Androidmanifest 里面的为 Application 添加一个名称属性
android:name=".MyApplication"
3,在 Activity、 Service、Broacast 可以使用 getApplication()的方法行到全局变量的
对象
3,MyApplication app= (MyApplication) getApplication()
点击之后
4.4  使用 startActivityForResult() 传值
在 Android应该用发时,有时需要在一个Activity 中调用 另一个Activity,当用户在第二个
Activity中选择完成时,程序自动返回到第一个Activity中,第一个Activity必须能够获取并显示
用户在第二个 Activity 中选择的结果,或者,在第一个 Activity 中将一些数据传递到第二个
Activity,由于这某些原因,又要返回到第一个 Activity 中,并显示传递的数据.如程序中经常出现
的” 返回上一步”功能,这时,也可以通过 Intent 和 Bundle 来实现,与在两个 Activity 之间交换数
据不同的是,此处需要使用 startActivityForResult()方法来启动另一个 Activity.
在第二个 Activity 启动之后把相应的数据放入到 Intent 之中,再在第一个 activity 的
onActivity 方法里面得到数据
说明 requestCode 请求码

resultCode 相应码,避免数据重复


五、  【熟悉】Activity  主题
在 AndroidManifest.xml 文件里面:
<activity name="test"
android:theme="@android:style/Theme.Wallpaper.NoTitleBar">
</activity>
大家也可以进行替换,具体都在下面了:
android:theme="@android:style/Theme.Dialog" : Activity 显示为对话框模式
android:theme="@android:style/Theme.NoTitleBar" : 不显示应用程序标题栏
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" : 不显示应用程序标题栏,并全

android:theme="Theme.Light ": 背景为白色
android:theme="Theme.Light.NoTitleBar" : 白色背景并无标题栏
android:theme="Theme.Light.NoTitleBar.Fullscreen" : 白色背景,无标题栏,全屏
android:theme="Theme.Black" : 背景黑色
android:theme="Theme.Black.NoTitleBar" : 黑色背景并无标题栏
android:theme="Theme.Black.NoTitleBar.Fullscreen" : 黑色背景,无标题栏,全屏
android:theme="Theme.Wallpaper" : 用系统桌面为应用程序背景
android:theme="Theme.Wallpaper.NoTitleBar" : 用系统桌面为应用程序背景,且无标题栏
android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen" : 用系统桌面为应用程序背景,无标
题栏,全屏
android:theme="Theme.Translucent : 透明背景
android:theme="Theme.Translucent.NoTitleBar" : 透明背景并无标题
android:theme="Theme.Translucent.NoTitleBar.Fullscreen" : 透明背景并无标题,全屏
android:theme="Theme.Panel ": 面板风格显示

android:theme="Theme.Light.Panel" : 平板风格显示


六、  【掌握】 保存数据和恢复数据的回调方法
何时使用
当Activity非正常关闭(退出)时,有可能是被系统kill,此时系统会调用保存数据的回调方法,
让用户保存 一些 业务处理的数据。
当非正常关闭的 Activity 再次显示时,在恢复数据的回调方法中可以恢复之前的数据数据。
关键方法
onSaveInstanceState(Bundle data) 保存数据的回调方法
onRestoreInstanceState(Bundle data) 恢复数据的回调方法
另外,恢复数据也可以在 onCreate(Bundle )方法中实现
何时触发
1、当用户按下 HOME 键时。
这是显而易见的,系统不知道你按下 HOME 后要运行多少其他的程序,自然也不知道 activity
A 是否会被销毁,故系统会调用 onSaveInstanceState,让用户有机会保存某些非永久性的数
据。以下几种情况的分析都遵循该原则
2、长按 HOME 键,选择运行其他的程序时。
3、按下电源按键(关闭屏幕显示)时。
4、从 activity A 中启动一个新的 activity 时。

5、屏幕方向切换时,例如从竖屏切换到横屏时。


七、  【掌握】 任务(Task) 和回退栈(Back Stack)
任务 (Task) : 
在 Android 应用程序启动时,系统会创建一个 Task,用于存储当前 MainActivity( 主页
面),在 Task 中使用了 Stack 栈的数据结构(在内存中进行分配),当 Activity 第一次创建时,
系统会将 Activity 的实例压入到 Back Stack (回退栈)中,当栈中的 Activity 按返回键时,系统
会将此 Activity 从 Back Stack 中弹出。简而言之,顶底的 Activity 是应用的主页面(窗体),
栈顶的 Ativity 是当前正显示的 Activity( 处于活动进程的 Activity)。
另外,Task 的生命周期是由栈底的 Activity 的生命周期决定的。当栈底的 Activity 销毁
时,此时 Task 也会销毁。
通过 ActivityManager.RunningTaskInfo 类显示当前任务栈中的信息
id : 任务编号
numActivities : 任务中 Activity 数量
baseActivity : 栈底的 Activity
topActivity : 栈顶的 Activity
获取 ActivityManager 系统服务的方法: 
ActivityManager aMgr=  (ActivityManager)
Context.getSystemService(Context.ACTIVITY_SERVICE);
获取:RunningTaskInfo
List<RunningTaskInfo> runTasks=aMgr.getRunningTasks(int max);
需要使用 android.permission.GET_TASK 权限,并将其在 AndroidManifest.xml 文件中进行
配置
之前已经了解到,Android 的 Task 通常起始于 HOME 页面下点击应用程序图标或其在桌
面快捷图标。所以我们在开发一个应用程序的时候,需要指定应用程序的入口 Activity,通
过在 AndroidManifest.xml 清单文件中某个<Activity/>标签内,使用<intent-filter/>标签内指定。
需要设置 action 为"android.intent.action.MAIN",设置 category
为"android.intent.category.LAUNCHER"。
<activity
android:name="com.hua.activity.MainActivity"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
这样,当用户点击应用程序图标之后,就会以这个入口 Activity 为基础,创建一个任务
(Task),而这个 Activity 为这个 Task 中的第一个 Activity,称为根 Activity。
0 0