其实这篇文章应该要在介绍Activity的时候写的,不过那个时候还不怎么熟悉Activity,还是在这里详细介绍下好了。还是参考下官方文档的图吧:

从上面的流程,我们可以看出首先就是打开APP,开始执行到当前的FirstActivity了,接着anroid系统会调用onCreate方法,然后是onStart方法,onResume方法,之后FirstActivity就完全启动好了,展现到前台,如果这个时候用intent启动了另一个SecondActivity的话,那么就会调用FirstActivity的onPause方法,通过back键返回到FirstActivity就会调用onResume方法,而此时SecondActivity会销毁会调用onStop方法,如果这个时候又从FirstActivity调用到SecondActivity,那么会调用onRestart方法,接着onStart方法,然后循环。但是如果这个时候内存不够,或者finish了Activity,那么就会调用onDestory方法,Activity就结束了,如果启动就必须重新创建了。

根据官方文档,介绍了Activiy的三个重要的循环对:

1、整个生命周期:从第一个onCreate方法到onDestroy方法。Activity需要在onCreate中准备所有的全局状态,需要在onDestroy方法中释放所有的资源。比如,我们有一个线程在后台跑需要从网络下载数据,我们再onCreate方法里创建线程,在onDestroy方法里停止线程。

2、可见生命周期:从onStart方法到onStop方法。顾名思义叫做可见生命周期,其实是因为这个过程用户可以很直观的在屏幕上看到Activity,在这两个过程之间我们可以保持我们需要展示给用户的资源。比如,我们可以在onStart方法中注册一个BroadcastReceiver监视一些改变来设置UI,当我们不在看到显示的UI的时候,我们需要在onStop方法中取消监视。onStart方法和onStop方法可以在用户可见和隐藏不多切换的时候被多次调用。

3、前台生命周期:这个过程从onResume方法到onPause方法。这个过程Activity是聚焦到最上层展现给用户。Activity从onResume到onPause可能切换非常频繁-例如当设备处于休眠状态,当result和一个新的intent被发送后,所以这里的代码需要非常简洁。

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();
}

关于各个函数在这里也做个简单的介绍,其实也是参考的官方文档:

1、onCreate方法:当Activity第一次被创建,调用onCreate方法。这里我们需要完成初始化操作:加载view布局,绑定事件等。

2、onRestart方法:在Activity被停止后调用该方法重新启动。

3、onStart方法:当Activity将要展示给用户的时候被调用。

4、onResume方法:当Activity可以和用户交互的时候被调用。这个时候Activity在Activity栈的栈顶,等待用户交互。

5、onPause方法:当系统准备启动或恢复之前的Activity的时候被调用,这个时候,我们需要保存数据,停止动画和其他一些耗费CPU资源的事情。这个实现必须非常快,因为如果函数未返回,会影响下一个Activity的resume。

6、onStop方法:当Activity长时间不可见的时候被调用。

7、onDestroy方法:当Activity被销毁时我们会收到最后一个调用。不管是调用finish方法还是因为系统没有为了释放空间都会调用该方法。

这些函数也讲解了,那么我们来了解下了上述的Activity栈,听名字我们也可以明白什么意思了,就是一个一个Activity就像栈一样,栈的话其实就和我们以前用过的储蓄硬币的小罐子,一个一个压进去,然后之后栈顶的取出来之后栈底的才能取出来,Activity也是如此。比如我们运行了FirstActivity,那么FirstActivity就进栈了,接着调用intent运行了SecondActivity,那么SecondActivity进栈了,FirstActiviy在栈底,接着按back键,SecondActivity出栈被销毁,FirstActiviy又出来了在栈顶。所有的显示在我们面前的Activity就是在栈顶的Activity了。

讲了这么多,接下来还是通过实例来看看运行结果吧。这里我们通过logcat来查看调用的情况,ui显示看信息已经不能满足要求了,下面我们新建个工程ActivityLifetime,具体新建就按照前几篇文章来,这里不多加赘述。

这里需要为了实现7种方法都有调用,所以就用了三个Activity,第一个是主的Activity,第二个是普通的Activity,第三个是Dialog。首先第一个Activity添加两个按钮,如下所示:

新建TestActivity和TestDialog两个Activity。代码基本相同,都加上textview。只是显示内容不一样,如下图:

 
  

但是这样仅仅是显示不一样的内容,不是dialog,那么需要在TestDialog的AndroidManifest中添加主题了:


<activity android:name=".TestDialog" android:theme="@style/Theme.AppCompat.Dialog"></activity>

既然这些都完成了,那么剩下就是把两个button按钮的功能给实现

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); startTestActivity = (Button)findViewById(R.id.button1);
startTestDialog = (Button)findViewById(R.id.button2); startTestActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intentActivity = new Intent(MainActivity.this, TestActivity.class);
startActivity(intentActivity);
}
}); startTestDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intentDialog = new Intent(MainActivity.this, TestDialog.class);
startActivity(intentDialog);
}
});
}

基本代码写好了,好像忘了我们的目的是生命周期,那就用logcat来看看打印信息吧。在三个Activity中添加7个方法的log信息。

package com.example.jared.activitylifetime;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button; public class MainActivity extends AppCompatActivity { public static String TAG = "MainActivity"; private Button startTestActivity;
private Button startTestDialog; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate is Called");
setContentView(R.layout.activity_main); startTestActivity = (Button)findViewById(R.id.button1);
startTestDialog = (Button)findViewById(R.id.button2); startTestActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intentActivity = new Intent(MainActivity.this, TestActivity.class);
startActivity(intentActivity);
}
}); startTestDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intentDialog = new Intent(MainActivity.this, TestDialog.class);
startActivity(intentDialog);
}
});
} @Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart is Called");
} @Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume is Called");
} @Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause is Called");
} @Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop is Called");
} @Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy is Called");
} @Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart is Called");
}
}

好了,代码已经全部添加完毕,那么我们来看看结果是不是如上面所说的一样呢?首先运行打开app,查看logcat如下:

02-03 07:38:59.105 6967-6967/com.example.jared.activitylifetime D/MainActivity: onCreate is Called
02-03 07:38:59.485 6967-6967/com.example.jared.activitylifetime D/MainActivity: onStart is Called
02-03 07:38:59.485 6967-6967/com.example.jared.activitylifetime D/MainActivity: onResume is Called

可以看出结果和我们所学的一样,接着打开另一个Activity,查看logcat如下:

02-03 07:45:32.425 6967-6967/com.example.jared.activitylifetime D/MainActivity: onPause is Called
02-03 07:45:36.305 6967-6967/com.example.jared.activitylifetime D/MainActivity: onStop is Called

接着按back键回退到MainActivity:

02-03 07:45:42.875 6967-6967/com.example.jared.activitylifetime D/MainActivity: onRestart is Called
02-03 07:45:42.875 6967-6967/com.example.jared.activitylifetime D/MainActivity: onStart is Called
02-03 07:45:42.875 6967-6967/com.example.jared.activitylifetime D/MainActivity: onResume is Called

从上可以知道首先app开启后启动了MainActivity,然后调用了onCreate->onStart->onResume,然后显示了MainActivity的UI,接着打开TestActivity的时候调用了onPause->onStop来停止MainActivity,显示TestActivity的UI,当按back键后,TestActivity被销毁,然后MainActivity调用了onRestart->onStart->onResume来重新显示MainActivity的UI。

接着我们看看打开Dialog的效果,查看logcat如下:

02-03 08:09:14.975 6967-6967/com.example.jared.activitylifetime D/MainActivity: onPause is Called

然后按back键退回到MainActivity:

02-03 08:10:02.335 6967-6967/com.example.jared.activitylifetime D/MainActivity: onResume is Called

因为MainActivity还是显示给用户的,只是在他之上还有一个dialog,所以不会stop Activity,而仅仅是Pause,然后Resume。

还有一点需要注意的就是如果在MainActivity之后启动了TestActivity,然后由于系统内存不够了,然后MainActivity会被Destroy,释放,虽然当我们再次按back键会重新创建MainActivity给人的感觉基本没事,但是万一MainActivity中原本就有用户输入的数据,比如注册的时候填写了一些信息,发现错了,想回去重新填写,那么就会出问题。

Android肯定想到了这个问题,有一个函数onSaveInstanceState方法就可以实现这个功能,在系统kill该MainActivity之前会先调用这个方法。然后我们可以在这个方法中保存一些信息。如下:

 protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String SaveData = "We must save the info";
String key = "SaveInfo";
outState.putString(key, SaveData);
}

信息保存好后,那么什么时候读取呢?之前那7个方法,也就onCreate方法有传入的参数了。那也是个Bundle,那个Bundle的话一般是null,只有这个会系统回收,需要重新create的时候才调用。

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate is Called");
setContentView(R.layout.activity_main);
if(savedInstanceState != null) {
String key = "SaveInfo";
String savedData = savedInstanceState.getString(key);
Log.d(TAG, savedData);
}
}

Activity的生命周期基本是就学到这里了。

Android开发学习之路--Activity之生命周期的更多相关文章

  1. Android开发学习之路--Activity之初体验

    环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...

  2. Android开发艺术1之Activity的生命周期

    作为<Android开发艺术探索>这本书的第一篇博客,我就多说几句.本系列博客旨在对书中相关内容进行解读,简化,提供一个入门到提高的流程.不敢说书评,也不能说教程,只希望对有些人有帮助就好 ...

  3. Android开发学习之路--Activity之四种启动模式

    后天终于可以回家了,马上就要过年了,趁着年底打酱油的模式,就多学习学习,然后记录记录吧.关于Activity已经学习了七七八八了,还有就是Activity的四种启动模式了,它们分别为,standard ...

  4. Android开发学习之路--Activity之Intent

    窗外再次飘起了小雪,还有1周就过年了,2016年即将到来,来年不知道自己将身处何处,船到桥头自然直吧.还是继续学习吧,上次学习了Activity,那么如果是两个Activity之间,怎么从一个Acti ...

  5. Android开发学习之路--基于vitamio的视频播放器(二)

      终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...

  6. Android开发学习之路--Android系统架构初探

    环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...

  7. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  8. Android开发学习之路--Android Studio cmake编译ffmpeg

      最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...

  9. Android开发学习之路--网络编程之xml、json

    一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...

随机推荐

  1. 在右键中添加以管理员运行CMD命令提示符 (进化版)

    直接代码,转过来的 20180316更新添加快捷键A,点右键按A即可: Windows Registry Editor Version 5.00 ; Created by: Shawn Brink ; ...

  2. 勤拂拭软件 java web 开发教程(1) - 开发环境搭建

    勤拂拭软件系列教程 之 Java Web开发之旅(1) Java Web开发环境搭建 1 前言 工作过程中,遇到不少朋友想要学习jsp开发,然而第一步都迈不出,连一个基本的环境都没有,试问,如何能够继 ...

  3. Python中高阶函数讲解

    高阶函数讲解 1. 常规高阶函数 递归函数 格式:def func_name(variable): '''__doc__'''#函数的说明文档 if 条件表达式:#限制递归退出值 pass retur ...

  4. 《java技术》第二次作业

    (一)学习总结 1.什么是构造方法?什么是构造方法的重载? 1)没有返回值,名字与类名相同,当新对象被创建的时候,构造函数会被调用,要想构造函数,必须声明对象并对其初始化.每一个类都有构造函数,如果没 ...

  5. 从零开始搭建口袋妖怪管理系统(2)-借助ngRoute实现详情页面跳转

    一.目标 上一次我们用Angular1.x完成了简单的口袋妖怪展示列表页面,现在我们想要了解口袋妖怪更多的信息,但是发现原有单行表格可能容纳不下口袋妖怪的所有信息,所以现在我们需要一个口袋妖怪详情界面 ...

  6. 微信小程序适配iphonex

      // 在app.js中判断是否是哪种设备 globalData: { isIphoneX: false, userInfo: null }, onShow:function(){ let that ...

  7. 微信内置浏览器 如何小窗不全屏播放视频?也可以尝试canvas.

    设置属性: <video height="100%" width="100%" autoplay="autoplay" control ...

  8. cassandra 3.x官方文档(3)---gossip通信协议及故障检测与恢复

    写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...

  9. springMVC源码分析--ModelAndViewContainer和ModelMap

    ModelAndViewContainer主要是用来返回Model对象的,在ModelAndViewContainer中有defaultModel和redirectModel, defaultMode ...

  10. Bootstrap3 栅格系统-嵌套列

    为了使用内置的栅格系统将内容再次嵌套,可以通过添加一个新的 .row 元素和一系列 .col-sm-* 元素到已经存在的 .col-sm-* 元素内.被嵌套的行(row)所包含的列(column)的个 ...