Activity的生命周期函数
前言:
上一篇文章写了关于Activity生命周期和生命周期状态的介绍,这一篇文章给大家聊聊Activity生命周期函数。
主Activity:
应用程序的入口一般都是桌面应用程序图标,用户点击应用图标打开应用,这是因为应用程序有主Activity,如果没有主Activity,应用程序就不会在桌面中显示。主Activity在AndroidManifest.xml中的声明如下:
XHTML
1
2
3
4
5
6
|
<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在AndroidManifest.xml声明的区别就是多了<action android:name="android.intent.action.MAIN" />和<category android:name="android.intent.category.LAUNCHER" />。 Activity有这两个声明才能在桌面应用程序列表中找到。
Activity的生命周期方法都会被系统回调,它们的调用时机都是什么呢?在这些方法中你需要做些什么?先看一张图,对照着图来讲解你可能理解的更明白。
图片来自google的developer官网。
OnCreat方法:
onCreat方法在Activity生命周期中只会被调用一次,onCreat后Activity进入Created状态。在这个方法中主要做的工作是初始化你这个Activity需要的资源和加载UI。初始化资源一般都是你定义的变量什么的。加载UI一般都是先在xml文件中设置好布局,然后通过setContentView(layout_xml)加载到应用窗口上(可以理解为每一个应用程序的界面最外层都有一个窗口,叫做Window,所有的view都显示在这个窗口上)。实例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
TextView mTextView; // Member variable for text view in the layout
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set the user interface layout for this Activity
// The layout file is defined in the project res/layout/main_activity.xml file
setContentView(R.layout.main_activity);
// Initialize member TextView so we can manipulate it later
mTextView = (TextView) findViewById(R.id.text_message);
}
|
OnStart方法:
onCreat方法执行完会紧接着调用到onStart方法,onStart方法后Activity进入Started状态。一般这个方法用不着,因为有其他方法可以替代它完成需要做的工作。这个方法调用完View就会变为可见状态,但是不可交互。从刚开始的图能看到onStart方法在整个生命周期中可能会被调用多次,在Activity进入Stoped状态后也可能再次经过onRestart-》onStart方法再次进入Started状态。
OnResume方法:
onStart方法执行完会紧接着调用onResume方法,走完这个方法Activity就会进入Resumed状态,此时的Activity获得了焦点,可见可交互,这个方法在生命周期中可能会多次调用,只要进入可交互状态必然会走这个方法。在进入这个方法时你需要准备好与用户交互的资源,也就是说用户要看的、要点击的UI资源都要能够快速响应用户,比如要准备好音乐播放器,用户点击播放立刻就能听到音乐。
OnPause方法:
在Activity被前台UI部分或者全部遮挡时会走onPause方法,此时Activity失去焦点,不可交互。比如弹出的对话框,或者进入其他Activity界面。在这个方法中你要处理好用户不再需要的资源,比如停止游戏,停止播放器等,并且需要保存用户现在的数据,比如游戏数据(关卡进度),播放数据(播放进度)等,但是不要进行太耗时的操作。google官网给出的建议是:
- Stop animations or other ongoing actions that could consume CPU.(停止一切消耗CPU的事,动画,线程等)
- Commit unsaved changes, but only if users expect such changes to be permanently saved when they leave (such as a draft email).(自动保存用户没有提交的数据,比如编辑的邮件草稿。)
- Release system resources, such as broadcast receivers, handles to sensors (like GPS), or any resources that may affect battery life while your activity is paused and the user does not need them.(当Activity暂停的时候释放占用的系统资源,这些资源是用户不再需要的,比如:广播,GPS,或者其他消耗电量的设备。)
官网的例子如下:
1
2
3
4
5
6
7
8
9
10
11
|
@Override
public void onPause() {
super.onPause(); // Always call the superclass method first
// Release the Camera because we don't need it when paused
// and other activities might need to use it.
if (mCamera != null) {
mCamera.release()
mCamera = null;
}
}
|
OnStop方法:
当activity的onStop方法被调用后,Activity进入Stoped状态,完全不可见,此时你需要完全释放用户不再需要的资源,尽管之前你调用了onPause方法释放了一部分资源,但是在onPause方法中你不能执行更大、更耗费CPU的方法,在onStop中使可以的。例如把数据保存到数据库:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@Override
protected void onStop() {
super.onStop(); // Always call the superclass method first
// Save the note's current draft, because the activity is stopping
// and we want to be sure the current note progress isn't lost.
ContentValues values = new ContentValues();
values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());
getContentResolver().update(
mUri, // The URI for the note to update.
values, // The map of column names and new values to apply to them.
null, // No SELECT criteria are used.
null // No WHERE columns are used.
);
}
|
在Stoped状态Activity在系统资源紧张的时候会直接被系统回收掉而不再调用onDestroy方法,当然这是很极端的时候发生的。
OnDestroy方法:
Activity生命周期的最后一个方法,一般不会再这个方法里做什么事,应为它有可能不会被调用。大部分的清理工作是在onPause和onStop方法中做的,这个方法是完成清理工作的最后机会,一些可能会引起内存泄露的线程应该在这个方法中停掉,Hander的消息也要清理掉。
总结:
我用了两篇文章来给大家聊聊Activity的生命周期和生命周期方法,主要是理解在各个生命周期方法中该做那些事,不该做那些事,这样就能保证UI显示的正确和快速,数据会被保存,该释放的资源会被释放。如果大家有什么问题可以关注下面的公众号给我留言,大家共同讨论。
关注微信公众平台:程序员互动联盟(coder_online),你可以第一时间获取原创技术文章,和(java/C/C++/Android/Windows/Linux)技术大牛做朋友,在线交流编程经验,获取编程基础知识,解决编程问题。程序员互动联盟,开发人员自己的家。
Activity的生命周期函数的更多相关文章
- Android Activity常用生命周期函数
在Activity中主要有7个常用的周期函数,他们分别是: (一)onCreate 在Activity对象被第一次创建时调用 注: 从另一个Activity返回到前一个Activity时,不会调用该函 ...
- 每天一点Android干货-Activity的生命周期
Activity Activity是这样一个程序组件,它为用户提供一个用于任务交互的画面. 一个应用程序通常由多个activity组成,它们彼此保持弱的绑定状态.典型的,当一个activity在一个应 ...
- Android学习笔记(十) Activity的生命周期
一.如何在一个应用程序中定义多个Activity -定义一个类,继承Activity -复写onCreate() setContentView(R.layout.secondLayout):设定该Ac ...
- Activity系列讲解---三大基本状态与七大生命周期函数
简介:四大组件之一,在应用中一个Activity可以用来表示一个界面,可以理解为用户可视化界面,一个android应用必须通过Activity来运行和启动. 1.三大基本状态与七大生命周期函数 2.代 ...
- Activity 和 生命周期: 创建
了解了整体的android创建流程之后,就分析一下到底这个过程中做了什么? activity创建中开始时由activityStack中的realstartActivityLocked函数中调用了act ...
- activity 和 生命周期 :流程
activity是android的一个基本的组件.讨论生命周期,taskstack等等的话题的时候.就不得不去看一下android framework层的源码了. 生命周期,实际就是系统调用andro ...
- 【Android开发学习笔记】【第五课】Activity的生命周期-上
今天学习Activity当中的七个生命周期函数: 首先得说一个事情,就是在代码当中如果加入了 System.out.println(" ------");之后,如何查看这里面的输出 ...
- Android组件系列----Activity的生命周期
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- Service官方教程(4)两种Service的生命周期函数
Managing the Lifecycle of a Service The lifecycle of a service is much simpler than that of an activ ...
随机推荐
- JB的IDE可视化MongoDB、MySQL数据库信息
一.问题: 在使用JB的IDE的时候(pycharm.IDEA等)可视化mysql和mongodb的数据库信息,效果如下 MySQL: MongoDB: 可视化数据表关系: 二.方法: 1.MySQ ...
- 用python turtle画玫瑰
1.turtle 库 2.画玫瑰的代码: import turtle turtle.penup() turtle.left() turtle.fd() turtle.pendown() turtle. ...
- python可能会用到的网络基础
网络编程 1.两种构架:(1)C/S构架:client, server (2) B/S构架:browser,server 2.地址相关:(1)MAC地址,物理地址,唯一,但可以更改 (2)ip地址,网 ...
- 关于PHP读取HTTP头的部分
本文转载自https://my.oschina.net/luoczi/blog/86608 1.关于PHP读取HTTP头的方法 $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名,与 ...
- macOS 安装 ctags
macOS 安装 ctags macOS 自带一个 ctags,但是不支持 -R 参数,递归产生tags文件 $ ctags -R --exclude=.git --exclude=log * cta ...
- app -webkit-box-orient: vertical 打包后不显示
先说明问题是什么: -webkit-box-orient: vertical 这个属性在本地运行调试是存在的,但是打包后这个属性消失了: 解决办法: 1.将-webkit-box-orient: ve ...
- Linux更新源汇总-18.9.7更新
企业站 阿里云:https://opsx.alibaba.com/mirror 网易:http://mirrors.163.com/ 教育站 北京理工大学:http://mirror.bit.edu. ...
- Windows 10 IoT Core 17093 for Insider 版本更新
新特性: General bug fixes Enabled Miracast on Dragonboard. 已知的一些问题: F5 driver deployment from Visual ...
- 先序遍历DOM树的5种方法
DOM树由文档中的所有节点(元素节点.文本节点.注释节点等)所构成的一个树结构,DOM树的解析和构建是浏览器要实现的关键功能.既然DOM树是一个树结构,那么我们就可以使用遍历树结构的相关方法来对DOM ...
- Android 通过onTouchEvent判断是否为双击事件
通过onTouchEvent判断是否为双击事件,通过前面一次up 跟本次down之间的时间差,并且点击的点的坐标偏移来确定是否为双击事件DOUBLE_TAP_TIMEOUT. boolean isMo ...