刚在看mars老师的视频,看到activity的生命周期,就看了一下,总结了一下.下面是各函数的调用时机



为了更清楚的看清楚工作的具体过程,举例如下:

,建立两个activity,一个main,一个another,在main里面放置button加监听器跳转向another,在每个复写的activity的状态方法里都加一个log输出,比如onCreate里面输出main:onCreate;

从启动到点击按钮,再从another按返回键返回main,输出如下:

启动:

main:onCreate

main:onStart

main:onResume

点击button启动another

main:onPause

another:onCreate

another:onStart

another:onResume

main:onStop

点击返回

another:onPause

main:onRestart

main:onStart

main:onResume

another:onStop

another:onDestory

下面是各个状态时候的特点





各个状态可以看做是成对存在的,比如在onPause状态,要回到前台则是调用onResume,如果是在onStop状态,则要调用onStart,(上图中右边的两条曲线所示),所以可以看做onPause和onResume是一对,onStop和onStart是一对,这样有什么好处呢.

比如要做一个简单的mp3的播放器,那播放音乐的函数调用应该放在哪个状态里面呢,首先,我们尝试放在最熟悉的onCreate里面,那么启动之后一切正常,onCreate,onStart,onResume三个状态依次执行,音乐也正常播放,那么这时候如果突然来了一个电话,电话的activity将要覆盖掉我们播放器的activity,音乐的activity依次是onPause,onStop,我们可以在onStop里面把播放音乐的线程暂停掉或者结束掉,总不能边放音乐边打电话吧.

,当你打完电话,返回到音乐activity时候呢,进入哪个状态呢,根据图中的流程很明显,正是进入了和onStop成对 的onStart里面,音乐界面是出来了,可是音乐并不播放,为什么呢,因为我们之前把播放音乐的线程启动放在了onCreate里面,而在前面的这几个过程里面并不涉及onCreate,.所以我们发现了问题所在,为了保证音乐的正常播放,我们应该把音乐播放的线程启动和暂停放在成对的状态里,播放在onStart那么暂停就放在onStop,播放在onResume那么暂停就放在onPause.这样就保证了播放的正常进行.

当然了,具体放在那里并没有死的规定,完全根据自己的需要进行设计.

下面附上以前看过的一篇介绍生命周期比较具体的文章,如果上面的过程还不是很清楚,可以继续往下看,如果已经理解了,到这里就可以啦.

首先看一下Android api中所提供的Activity生命周期图(不明白的,可以看完整篇文章,在回头看一下这个图,你会明白的):

Activity其实是继承了ApplicationContext这个类,我们可以重写以下方法,如下代码:

view plaincopy to clipboardprint?
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}

为了便于大家更好的理解,我简单的写了一个Demo,不明白Activity周期的朋友们,可以亲手实践一下,大家按照我的步骤来。

第一步:新建一个Android工程,我这里命名为ActivityDemo.

第二步:修改ActivityDemo.java(我这里重新写了以上的七种方法,主要用Log打印),代码如下:

package com.tutor.activitydemo;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class ActivityDemo extends Activity {
private static final String TAG = "ActivityDemo";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.e(TAG, "start onCreate~~~");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "start onStart~~~");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG, "start onRestart~~~");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "start onResume~~~");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG, "start onPause~~~");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "start onStop~~~");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "start onDestroy~~~");
}
}

第三步:运行上述工程,效果图如下(没什么特别的):

核心在Logcat视窗里,如果你还不会用Logcat你可以看一下我的这篇文章Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e),我们打开应用时先后执行了onCreate()->onStart()->onResume三个方法,看一下LogCat视窗如下:

BACK键:

当我们按BACK键时,我们这个应用程序将结束,这时候我们将先后调用onPause()->onStop()->onDestory()三个方法,如下图所示:

HOME键:

当我们打开应用程序时,比如浏览器,我正在浏览NBA新闻,看到一半时,我突然想听歌,这时候我们会选择按HOME键,然后去打开音乐应用程序,而当我们按HOME的时候,Activity先后执行了onPause()->onStop()这两个方法,这时候应用程序并没有销毁。如下图所示:

而当我们再次启动ActivityDemo应用程序时,则先后分别执行了onRestart()->onStart()->onResume()三个方法,如下图所示:

这里我们会引出一个问题,当我们按HOME键,然后再进入ActivityDemo应用时,我们的应用的状态应该是和按HOME键之前的状态是一样的,同样为了方便理解,在这里我将ActivityDemo的代码作一些修改,就是增加一个EditText。

第四步:修改main.xml布局文件(增加了一个EditText),代码如下:

 <?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="@string/hello"/>
<EditText
android:id="@+id/editText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>

第五步:然后其他不变,运行ActivityDemo程序,在EditText里输入如"Frankie"字符串(如下图:)

这时候,大家可以按一下HOME键,然后再次启动ActivityDemo应用程序,这时候EditText里并没有我们输入的"Frankie"字样,如下图:

这显然不能称得一个合格的应用程序,所以我们需要在Activity几个方法里自己实现,如下第六步所示:

第六步修改ActivityDemo.java代码如下:

 package com.tutor.activitydemo;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
public class ActivityDemo extends Activity {
private static final String TAG = "ActivityDemo";
private EditText mEditText;
//定义一个String 类型用来存取我们EditText输入的值 private String mString;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mEditText = (EditText)findViewById(R.id.editText);
Log.e(TAG, "start onCreate~~~");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "start onStart~~~");
}
//当按HOME键时,然后再次启动应用时,我们要恢复先前状态 @Override
protected void onRestart() {
super.onRestart();
mEditText.setText(mString);
Log.e(TAG, "start onRestart~~~");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "start onResume~~~");
}
//当我们按HOME键时,我在onPause方法里,将输入的值赋给mString @Override
protected void onPause() {
super.onPause();
mString = mEditText.getText().toString();
Log.e(TAG, "start onPause~~~");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "start onStop~~~");
} @Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "start onDestroy~~~");
}
}

第七步:重新运行ActivityDemo程序,重复第五步操作,当我们按HOME键时,再次启动应用程序时,EditText里有上次输入的"Frankie"字样,如下图如示:

OK,大功基本告成,这时候大家可以在回上面看一下Activity生命周期图,我想大家应该完全了解了Activity的生命周期了,不知道你了解了没?

 

activity的生命周期详解的更多相关文章

  1. Android Activity的生命周期详解

    应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应. Activity之间通过Intent进行通信.在Intent 的描述结构中,有两个最 ...

  2. ASP.NT运行原理和页面生命周期详解及其应用

    ASP.NT运行原理和页面生命周期详解及其应用 1. 下面是我画的一张关于asp.net运行原理和页面生命周期的一张详解图.如果你对具体不太了解,请参照博客园其他帖子.在这里我主要讲解它的实际应用.  ...

  3. ASP.NET生命周期详解

    最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等 ...

  4. ASP.NET生命周期详解 [转]

    最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等 ...

  5. ASP.NET生命周期详解(转)

    看到好文章需要分享. 最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多 ...

  6. React—组件生命周期详解

    React—组件生命周期详解 转自 明明的博客  http://blog.csdn.net/slandove/article/details/50748473 (非原创) 版权声明:转载请注明出处,欢 ...

  7. Android Activity 生命周期详解

    学习android开发这么久对于activity的生命周期还没有仔细思考过,所以,我大致的把这些东西整理一下,希望通过这使自己理解的更透彻点吧! 首先看一下Activity生命周期图和它的的四个阶段 ...

  8. Android学习笔记:Activity生命周期详解

    进行android的开发,必须深入了解Activity的生命周期.而对这个讲述最权威.最好的莫过于google的开发文档了. 本文的讲述主要是对 http://developer.android.co ...

  9. xamarin Android activity生命周期详解

    学Xamarin我为什么要写这样一篇关于Android 的activity生命周期的文章 已经学Xamarin android有一段时间了,现在想起当初Xamarin也走了不少的弯路.当然Xamari ...

随机推荐

  1. 三维偏序-二维LIS

    Another Longest Increasing Subsequence Problem 有两种思路. 思路一: 考虑到如果只有一维,那么可以用f[s]表示长度为s时,最后一个数是多少,把这个想法 ...

  2. uva 508 Morse Mismatches

    Samuel F. B. Morse is best known for the coding scheme that carries his name. Morse code is still us ...

  3. JavaScript 全局变量命名空间生成函数

    <script type="text/javascript"> var GLOBAL = {}; GLOBAL.namespace = function(str){ v ...

  4. CentOS 安装redis2.8.13 提醒"libc.so.6: version `GLIBC_2.14' not found"系统的glibc版本太低

    以下在系统CentOS 6.3 x86_64上操作 1.试图运行程序,提示"libc.so.6: version `GLIBC_2.14' not found",原因是系统的gli ...

  5. Common-logging 与 Log4j的结合使用

    分类: Java 一.结合说明 在我们的日常开发中,经常需要通过输出一些信息进行程序的调试,如果到处都用system.out.println()则在项目发布之后要逐一删除,而log4j提供了一种新的调 ...

  6. python笔记之提取网页中的超链接

    python笔记之提取网页中的超链接 对于提取网页中的超链接,先把网页内容读取出来,然后用beautifulsoup来解析是比较方便的.但是我发现一个问题,如果直接提取a标签的href,就会包含jav ...

  7. c链表结点的删除和添加

    #include<stdio.h> #include<stdlib.h> typedef char datetype;/*定义新的数据类型名*/ typedef struct ...

  8. mysql trigger 权限的说明

    普通用户在创建trigger时会遇到的问题: 1.如果开启了二进制日志,但是用户没有supper 权限:那么他在创建trigger 时会提示设置log_bin_trust_function_creat ...

  9. load average[zhuan]

    load average值的含义 单核处理器 假设我们的系统是单CPU单内核的,把它比喻成是一条单向马路,把CPU任务比作汽车.当车不多的时候,load <1:当车占满整个马路的时候 load= ...

  10. slime+sbcl for common lisp

    sudo apt-get install slime audo apt-get install sbcl ;;sbcl+slime for common lisp ;;sudo apt-get ins ...