Android学习笔记(六)
活动的生命周期
Android中的活动是可以重叠的,每启动一个新的活动,就会覆盖在原活动之上,然后点击Back键就会销毁最上面的活动。
Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,也被称为返回栈(Back Stack)。
每个活动在其生命周期中有三种状态:
1.运行状态
一个活动位于返回栈的栈顶时,这时活动就处于运行状态。
2.暂停状态
一个活动不再处于栈顶位置,但仍然可见,这时活动就进入了暂停状态。
3.停止状态
一个活动不再处于栈顶位置,并且完全不可见是时候,就进入了停止状态。
Activity类中定义了七个回调方法,覆盖了生命周期的每一个环节:
1.onCreate()方法
它会在活动第一次被创建时调用,在该方法中完成活动的初始化操作,例如加载布局,绑定事件等。
2.onStart()方法
该方法在活动由不可见变为可见时调用。
3.onResume()方法
该方法在准备好和用户进行交互的时候调用。
4.onPause()方法
该方法在系统准备去启动或者恢复另一个活动的时候调用。
5.onStop()方法
该方法在活动完全不可见时调用。它和onPause()方法的主要区别是,如果启动的新活动是一个对话框活动,onPause()方法会被调用,而onStop()方法不会执行。
6.onDestroy()方法
该方法在活动被销毁之前调用。
7.onRestart()方法
该方法在活动由停止状态变为运行状态之前调用,活动被重新启动。
附上Android官方提供的一张活动的生命周期示意图:

新建一个Android工程,新建时自动创建活动和布局。
新建一个normal_layout.xml文件,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/normal_activity"
/>
</LinearLayout>
该布局中,简单使用一个TextView来显示一行文字。
在新建一个dialog_layout.xml文件,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dialog_activity"
/>
</LinearLayout>
然后新建NormalActivity继承自Activity,代码如下:
package com.gfeng.activitylifecycletest;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
public class NormalActivity extends Activity {
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.normal_layout);
}
}
在NormalActivity类中加载normal_layout布局。
在新建一个DialogActivity继承自Activity,代码如下:
package com.gfeng.activitylifecycletest;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
public class DialogActivity extends Activity {
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.dialog_layout);
}
}
在DialogActivity类中加载dialog_layout布局。
最后在AndroidManifest.xml文件中分别注册NormalActivity和DialogActivity活动。添加代码如下:
<activity
android:name=".NormalActivity" >
</activity>
<activity
android:name=".DialogActivity"
android:theme="@android:style/Theme.Dialog" >
</activity>
这里对两个活动的注册代码不同,DialogActivity使用了android:theme属性,用于给当前活动指定主题的。
下面修改activity_main.xml,重新定制主活动的布局,修改代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/start_normal_activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/start_normal_activity" />
<Button
android:id="@+id/start_dialog_activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/start_dialog_activity" />
</LinearLayout>
在这里使用LinearLayout,加入两个按钮,一个用来启动NormalActivity,另一个用来启动DialogActivity。
然后修改MainActivity中的代码:
package com.gfeng.activitylifecycletest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
public class MainActivity extends Activity {
public static final String TGA = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TGA, "onCreate");
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
Button startNormalActivity = (Button) findViewById(R.id.start_normal_activity);
startNormalActivity.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//显示Intent方法的使用
Intent intent = new Intent(MainActivity.this,NormalActivity.class);
startActivity(intent);
}
});
Button startDialogActivity = (Button) findViewById(R.id.start_dialog_activity);
startDialogActivity.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//显示Intent方法的使用
Intent intent = new Intent(MainActivity.this,DialogActivity.class);
startActivity(intent);
}
});
}
protected void onStart() {
super.onStart();
Log.d(TGA, "onStart");
}
protected void onResume() {
super.onResume();
Log.d(TGA, "onResume");
}
protected void onPause() {
super.onPause();
Log.d(TGA, "onpause");
}
protected void onStop() {
super.onStop();
Log.d(TGA, "onStop");
}
protected void OnDestroy() {
super.onDestroy();
Log.d(TGA, "onDestroy");
}
protected void onRestart() {
super.onRestart();
Log.d(TGA, "onRestart");
}
}
在onCreate()方法中,分别为两个按钮注册了点击事件,点击第一个按钮会启动NormalActivity,点击第二个按钮会启动DialogActivity。然后在Activity的七个回调方法中分别打印一句话,在通过日志
来理解活动的生命周期。
运行程序,效果下图如图所示:

观察LogCat中的打印日志,可以得到下图所示:

通过日志可以看到,当MainActivity第一次被创建时会依次执行onCreate()、onStart()、onResume()方法。
点击一个按钮,启动NormalActivity,得到下图所示:

此时查看LogCat打印的日志可以得到下图:

由于NormalActivity把MainActivity完全挡住,所以onPause()和onStop()方法都会被执行。然后按Back键返回到MainActivity,LogCat打印的日志信息如下图所示:

由于MianActivity之前已经进入停止状态,所以onRestart()方法会被执行,之后由依次onStart()和onResume()方法。
然后在点击第二个按钮,启动DialogActivity,如下图所示:

此时观察LogCat的打印信息,会得到如下图所示的信息:

由于DialogActivity没有完全挡住MainActivity,此时MainActivity只是进入了暂停状态,只有onPause()方法会被执行。
相应地,按下Back键返回MainActivity也只有onResume()方法会被执行。如下图所示:

最后在MainActivity界面下按下Back键退出程序,查看LogCat的打印信息,会得到下图所示:

一次执行了onPause()和onStop()方法。程序并没有执行onDestroy()方法,根据官方给出的活动的生命周期图,可以看到app process killed可以摧毁程序的进程。
Android学习笔记(六)的更多相关文章
- android学习笔记六——Spinner
注:参考http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0105/2264.html Spinner ==> Spinner ...
- android学习笔记六
Android中Activity的Intent大全 Api Level 3: (SDK 1.5) android.intent.action.ALL_APPS android.intent.actio ...
- Android学习笔记六:六大布局
六大界面布局方式包括: 线性布局(LinearLayout).帧布局(FrameLayout).表格布局(TableLayout).相对布局(RelativeLayout).绝对布局(Absolute ...
- 【转】 Pro Android学习笔记(七六):服务(1):local和remote
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Android提供服务,服务是运行在后台的 ...
- 【转】 Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart
目录(?)[-] 建立测试环境 开发环境导入第三方JAR HTTP Post Multipart小例子 HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件.HTTP Po ...
- 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET
目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...
- 【转】 Pro Android学习笔记(五六):配置变化
目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...
- android学习笔记12——ListView、ListActivity
ListView.ListActivity ==> ListView以垂直列表的形式显示所有列表项. 创建ListView的方式: 1.直接使用ListView创建 2.Activity继承Li ...
- 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...
- 【转】Pro Android学习笔记(二三):用户界面和控制(11):其他控件
目录(?)[-] Chronometer计时器控件 倒计时CountDownTimer Switch控件 Space控件 其他控件 Android提供了很多控件,基本上都是view的扩展. Chron ...
随机推荐
- Nginx reopen reload作用及工作过程
http://www.iigrowing.cn/nginx-reopen-reload-zuo-yong-ji-gong-zuo-guo-cheng.html Nginx reopen reload作 ...
- 使用NodeJS、GruntCLI遇到的问题
运行环境CMD NODEJS版本v0.8.4 node --version 需求:需要用到Grunt的JS编译功能,各位别笑我. 使用代理 npm config set proxy http://i ...
- Windows与Linux主机之间的连接和交互工具
1.Putty 远程连接Linux主机 Windows主机上安装putty,工具打开后显示如下: 输入要连接的Linux主机的IP地址,点击Load,连接主机后输入用户名密码,即可登录Linux主机 ...
- Solr整合中文分词组件IKAnalyzer
我用的Solr是4.10版本, 在csdn下载这个版本的IKAnalyzer:IK Analyzer 2012FF_hf1.zip 解压后目录如下: (1)这里还用solr自带的example实验分词 ...
- windows 7 32bit安装 python3.5.0 安装错误 0x80240017 -未指定错误
日志显示如下: [0F60:03D4][2015-10-20T10:47:52]i001: Burn v3.10.0.1823, Windows v6.1 (Build 7600: Service P ...
- Struts2中实现Web项目的初始化工作
Struts2中实现Web项目的初始化工作 注:通常web系统在启动时需要做一些初始化的工作,比如初始化系统全局变量,加载自定义配置文件,启动定时任务等. 一.在Struts中实现系统的初始化工作 ...
- Charles的使用
简介 Charles是在Mac下常用的截取网络封包的工具,在做iOS开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析.Charles通过将自己设置成系统的网络访问代理服务器,使 ...
- git学习(这个我没有整理,是我不断在学习的过程中,自己总结的,对象是我,不过有问题的,我们可以相互交流)
每次git提交,都会有一个parent指针,指向上一次的commit , 如果合并,master就和hotfix河道一起,就直接删除hotfix就OK 此时,虽然操作一样,大底层实现不一样 ...
- css布局之一列布局
在我们浏览网页中经常看见一列布局其实一列布局就是 一般的一列布局的都是固定宽度的 body{margin:0;padding:0} .main{width:800px;height:300px;bac ...
- java 泛型详解
public class Base<T>{ Class classType=T.class; public Base(){ //想在这里 得到T的类对象 赋值给 cla ...