android_activity_研究(二)
这次开始玩玩活动的生命周期。废话不说,先搞个小应用,大体思路是:主界面有两个按钮,一个按钮按下后,出现第二个界面;另一个按钮按下后,出现第三个界面,真他妈简单。
一、主界面:
1. 主界面布局xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<Button
android:id="@+id/btnToSecond"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="callSecondActivity" />
<Button
android:id="@+id/btnToThird"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="callThirdActivity" />
</LinearLayout>
我的神~~~
2. 主界面逻辑代码:
package cn.com.sxp;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class ActivityLifeActivity extends Activity {
private static final String TAG = ActivityLifeActivity.class
.getSimpleName();
private Button btnToSecond = null;
private Button btnToThird = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i(TAG, "ActivityLifeActivity onCreate()");
btnToSecond = (Button) this.findViewById(R.id.btnToSecond);
btnToSecond.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ActivityLifeActivity.this,
secondActivity.class);
startActivity(intent);
}
});
btnToThird = (Button) this.findViewById(R.id.btnToThird);
btnToThird.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ActivityLifeActivity.this,
thirdActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
Log.i(TAG, "ActivityLifeActivity onDestroy()");
super.onDestroy();
}
@Override
protected void onPause() {
Log.i(TAG, "ActivityLifeActivity onPause()");
super.onPause();
}
@Override
protected void onRestart() {
Log.i(TAG, "ActivityLifeActivity onRestart()");
super.onRestart();
}
@Override
protected void onResume() {
Log.i(TAG, "ActivityLifeActivity onResume()");
super.onResume();
}
@Override
protected void onStart() {
Log.i(TAG, "ActivityLifeActivity onStart()");
super.onStart();
}
@Override
protected void onStop() {
Log.i(TAG, "ActivityLifeActivity onStop()");
super.onStop();
}
}
漂亮:这样的话,搞出来的界面就是:

跑出来的日志:

可以看到,主界面活动经过了创建、开始、恢复三个状态。
二、第二个界面
1. 界面的xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="欢迎来到第二个活动"
/>
</LinearLayout>
很简单,就一个文本框,说着一些废话。
2. 第二个见面的逻辑代码:
package cn.com.sxp;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import cn.com.sxp.R;
public class secondActivity extends Activity {
private static final String TAG = secondActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
Log.i(TAG, "secondActivity onCreate()");
}
@Override
protected void onDestroy() {
Log.i(TAG, "secondActivity onDestroy()");
super.onDestroy();
}
@Override
protected void onPause() {
Log.i(TAG, "secondActivity onPause()");
super.onPause();
}
@Override
protected void onRestart() {
Log.i(TAG, "secondActivity onRestart()");
super.onRestart();
}
@Override
protected void onResume() {
Log.i(TAG, "secondActivity onResume()");
super.onResume();
}
@Override
protected void onStart() {
Log.i(TAG, "secondActivity onStart()");
super.onStart();
}
@Override
protected void onStop() {
Log.i(TAG, "secondActivity onStop()");
super.onStop();
}
}
哇靠,日志打得真JB详细。
3. 看效果
此时,我在主界面按第一个按钮,效果图如下:

再来看日志:

瓦擦,谁能告诉我发生了什么!
主活动暂停了,不过此时你还能看到主界面,只是你不能与之交互了;第二个界面活动经历了创建、开始、恢复变得与客户可见,客户还能操作它;最后,主界面完全不可见了,不过并没有销毁。
好吧,我按下退后按钮,会发生什么?

I can not believe~~~
退回到主界面时,二界面先暂停,他不肯离去;主界面此时并未销毁,因此是重启状态,开始状态,恢复状态;二界面停止,并且销毁。在一个界面,按下退后键应该就是销毁这个活动吧。
从活动栈的角度来说,二界面出现时,主界面是在被入栈的,二界面此时在栈顶;主界面要想重新占据栈顶,必须把现有的栈顶的活动宰掉才行;宰掉就是销毁了。
三、主界面按下退后键呢?

主界面被宰了,被销毁了。
我按下“esc”键,主界面也是被销毁。
四、不不,我不按后退,我按home键
请看日志:

what happened~~~主界面活动没有被销毁,它只是stop~~~stop
当我在手机上重启启动这个主界面,回调的是restart(),Oh~~~what a kidding~~~
五、关于 onSaveInstanceState() 和 onRestoreInstanceState()两个方法呢?更值得研究一下
android_activity_研究(二)的更多相关文章
- Fiddler实战深入研究(二)
Fiddler实战深入研究(二) 阅读目录 Fiddler不能捕获chrome的session的设置 理解数据包统计 请求重定向(AutoResponder) Composer选项卡 Filters选 ...
- (转载)Fiddler实战深入研究(二)
原文来源于:http://www.cnblogs.com/tugenhua0707/p/4637771.html,作者:涂根华 !个人觉得文章写的特别好,故收藏于此,感谢原作者的分享 Fiddler实 ...
- Fiddler实战深入研究(二)[转载]
Fiddler实战深入研究(二) 阅读目录 Fiddler不能捕获chrome的session的设置 理解数据包统计 请求重定向(AutoResponder) Composer选项卡 Filters选 ...
- Nginx源码研究二:NGINX的事件处理概论
NGINX作为服务端的应用程序,在客户端发出数据后,服务端在做着这样一些处理,数据先会经过网卡,网卡会和操作系统做交互,经过操作系统的协议栈处理,再和不同的应用程序交互. 在这里面涉及两个概念,一个是 ...
- tomcat 组件研究二--请求过程
上一篇博客大概总结了tomcat 的组件以及其组织方式,对于tomcat 的启动过程也进行进行了简单的总结,下面这篇博客,继续研究tomcat 处理请求的相关组件,其实就是主要研究Connectors ...
- [转] Java se 7新特性研究(二)
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp82 今天主要研究Java se 7中异常处理的新功能.从今天开始正在 ...
- android_activity_研究(一)
android中活动的概念(activity)是一个很重要的东东.这里有很多东东值得好好研究.最好的研究来源当然是官网啦,所以本人这里写一点对官网文章的研究心得. 一.活动(activity)的概念 ...
- dedecms代码研究二
dedecms代码研究(2)从index开始现在继续,今天讲的主要是dedecms的入口代码.先打开index.PHP看看里面是什么吧.打开根目录下的index.php嗯映入眼帘的是一个if语句.检查 ...
- 关于linux系统如何实现fork的研究(二)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 前一篇关于linux系统如何实现fork的研究(一)通过代码已经说明了从用户态怎么通过软中断实现调用系统调 ...
随机推荐
- ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 入门案例分析 在第一章里,我们已经对ArcGIS系列软件的体系结构有了一 ...
- 水晶报表异常“CrystalDecisions.ReportSource.ReportSourceFactory”的类型初始值设定项引发异常,未能加载文件或程序集“log4net
System.TypeInitializationException: “CrystalDecisions.ReportSource.ReportSourceFactory”的类型初始值设定项引发异常 ...
- 【Windows10 IoT开发系列】配置篇
原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry ...
- mencache的使用二
在这里说的是在C#中的使用,在C#中使用是需要引入驱动的, 可以在网上找,这里推荐一个链接http://sourceforge.net/projects/memcacheddotnet/ 将Memca ...
- 《解读window核心编程》 之 进程
1. 进程是执行文件的运行时形态.包括两部分:内核数据(对应内核对象).地址空间(包括执行文件代码和栈堆等动态内存). 2. 把VC的“系统-子系统”值删除掉,即不指定 ...
- Spectre小计
今天安装了vs2017,而后又安装了wdk,随便写了一个控制台测试程序,居然报错.网上也查了一圈,也没有得到解决.报错内容如下: MSB8038:已启用Spectre缓解,但找不到Spectre缓解库 ...
- 在前后端分离项目中使用SpringBoot集成Shiro
前言 这次在处理一个小项目时用到了前后端分离,服务端使用springboot2.x.权限验证使用了Shiro.前后端分离首先需要解决的是跨域问题,POST接口跨域时会预发送一个OPTIONS请求,浏览 ...
- 解决npm install卡住不动的小尴尬
npm install卡顿问题记录 遇到的问题 npm install -g @angular/cli 安装angular cli工具时,发现进度条一直卡住不动,相信很多朋友也遇到过.原因应该是国内的 ...
- 《Spring Cloud》学习(二) 负载均衡!
第二章 负载均衡 负载均衡是对系统的高可用.网络压力的缓解和处理能力扩容的重要手段之一.Spring Cloud Ribbon是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于Netfli ...
- Ember报错
错误是ember-data的版本不对 解决办法是: npm install --save ember-data@2.14.2 //bing.com中去查资料,应有尽有