android开发艺术探索学习 之 结合Activity的生命周期了解Activity的LaunchMode

时间:2023-01-27 18:23:38

转载请标明出处:

http://blog.csdn.net/lxk_1993/article/details/50749728

本文出自:【lxk_1993的博客】

首先还是先介绍下Activity的launchMode.一共同拥有四种.

1.standard.

2.singleTop.

3.singleTask.

4.singleInstance.

第一种standard.就是无论怎么样每次启动都会创建一个新的实例。也就是系统默认的启动方式。

我们设置ActivityA的启动方式为standard.设置点击运行startActivity(newIntent(ActivityA.this,
ActivityA.class));

点击两次。我们看到打印的logcat信息例如以下:

02-26 07:34:26.186 16672-16672/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onCreate()

02-26 07:34:26.190 16672-16672/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onStart()

02-26 07:34:26.190 16672-16672/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onResume()

02-26 07:34:29.594 16672-16672/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onPause()

02-26 07:34:29.598 16672-16672/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onCreate()

02-26 07:34:29.598 16672-16672/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onStart()

02-26 07:34:29.598 16672-16672/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onResume()

02-26 07:34:29.974 16672-16672/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onStop()

02-26 07:34:31.030 16672-16672/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onPause()

02-26 07:34:31.030 16672-16672/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onCreate()

02-26 07:34:31.034 16672-16672/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onStart()

02-26 07:34:31.034 16672-16672/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onResume()

02-26 07:34:31.406 16672-16672/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onStop()

在这里ActivityA调用了三次oncreate()方法。所以一共同拥有3个不同的ActivityA实例。

另外一种是singleTop,栈顶复用模式。就是 假设这个ActivityA已经位于栈的顶部,那么从ActivityA启动ActivityA,就不会又一次创建ActivityA。将ActivityA的启动模式改为singTop,像上面那样測试,打印的logcat信息例如以下。

02-26 07:53:19.802 1953-1953/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onCreate()

02-26 07:53:19.830 1953-1953/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onStart()

02-26 07:53:19.830 1953-1953/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onResume()

02-26 07:53:23.750 1953-1953/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onPause()

02-26 07:53:23.750 1953-1953/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onResume()

02-26 07:53:25.046 1953-1953/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onPause()

02-26 07:53:25.046 1953-1953/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onResume()

所以能够看出仅仅创建了一个Activity.

可是假设ActivityA不在栈顶,我们添加一个启动模式为standard的ActivityB。 測试 A 启动 B, B在启动A.logcat信息例如以下。

02-26 07:57:13.466 5559-5559/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onCreate()

02-26 07:57:13.470 5559-5559/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onStart()

02-26 07:57:13.470 5559-5559/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onResume()

02-26 07:57:15.462 5559-5559/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onPause()

02-26 07:57:15.470 5559-5559/com.hnpolice.xiaoke.activitylaunchmode E/----B----: onCreate()

02-26 07:57:15.506 5559-5559/com.hnpolice.xiaoke.activitylaunchmode E/----B----: onStart()

02-26 07:57:15.506 5559-5559/com.hnpolice.xiaoke.activitylaunchmode E/----B----: onResume()

02-26 07:57:15.942 5559-5559/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onStop()

02-26 07:57:16.830 5559-5559/com.hnpolice.xiaoke.activitylaunchmode E/----B----: onPause()

02-26 07:57:16.834 5559-5559/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onCreate()

02-26 07:57:16.834 5559-5559/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onStart()

02-26 07:57:16.834 5559-5559/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onResume()

02-26 07:57:17.226 5559-5559/com.hnpolice.xiaoke.activitylaunchmode E/----B----: onStop()

显然从B到A的时候又创建了一个ActivityA. 所以带singleTop这种启动模式的Activity。仅仅有这个Activity在栈顶的时候。在启动这个Activity才不会又一次创建新的Activity.否则就和standard没什么差别。并且日常开发中我们非常少会有 Activity自己在启动自己这种情况。

第三种:singleTask.栈内复用模式。如果A的启动模式是singleTask.那么在一个栈中仅仅会存在一个A的实例。

而且当A不在栈顶的时候,再启动A的话,会直接销毁 栈中位于 A 上面的全部Activity实例。我们再新增launchMode为standard的B和C。

然后启动A,从A启动B,从B启动C,在从C启动A.打印的logcat信息例如以下.

02-26 08:17:27.358 24079-24079/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onCreate()

02-26 08:17:27.366 24079-24079/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onStart()

02-26 08:17:27.366 24079-24079/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onResume()

02-26 08:17:29.042 24079-24079/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onPause()

02-26 08:17:29.046 24079-24079/com.hnpolice.xiaoke.activitylaunchmode E/----B----: onCreate()

02-26 08:17:29.074 24079-24079/com.hnpolice.xiaoke.activitylaunchmode E/----B----: onStart()

02-26 08:17:29.074 24079-24079/com.hnpolice.xiaoke.activitylaunchmode E/----B----: onResume()

02-26 08:17:29.474 24079-24079/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onStop()

02-26 08:17:30.498 24079-24079/com.hnpolice.xiaoke.activitylaunchmode E/----B----: onPause()

02-26 08:17:30.502 24079-24079/com.hnpolice.xiaoke.activitylaunchmode E/----C----: onCreate()

02-26 08:17:30.506 24079-24079/com.hnpolice.xiaoke.activitylaunchmode E/----C----: onStart()

02-26 08:17:30.506 24079-24079/com.hnpolice.xiaoke.activitylaunchmode E/----C----: onResume()

02-26 08:17:30.910 24079-24079/com.hnpolice.xiaoke.activitylaunchmode
E/----B----: onStop()

02-26 08:17:32.414 24079-24079/com.hnpolice.xiaoke.activitylaunchmode
E/----B----: onDestroy()

02-26 08:17:32.422 24079-24079/com.hnpolice.xiaoke.activitylaunchmode
E/----C----: onPause()

02-26 08:17:32.422 24079-24079/com.hnpolice.xiaoke.activitylaunchmode
E/----A----: onRestart()

02-26 08:17:32.422 24079-24079/com.hnpolice.xiaoke.activitylaunchmode
E/----A----: onStart()

02-26 08:17:32.422 24079-24079/com.hnpolice.xiaoke.activitylaunchmode
E/----A----: onResume()

02-26 08:17:32.790 24079-24079/com.hnpolice.xiaoke.activitylaunchmode
E/----C----: onStop()

02-26 08:17:32.790 24079-24079/com.hnpolice.xiaoke.activitylaunchmode
E/----C----: onDestroy()

从logcat信息我们能够看到,当从C启动A的时候,在又一次启动A之前,也就是C的onPause()之前会依次销毁栈内在A和C之间的Activity实例。然后当启动完A之后再销毁C。如果A是singTask模式,BCDE都是标准模式。然后一次启动ABCDE,然后在启动A.在E的onPause方法之前会依次条用B、C、D的onStop和onDestroy方法.然后当启动完A之后再调用E的
onstop和 ondestroy销毁E.

05-11 06:11:39.031 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onCreate()

05-11 06:11:39.099 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onStart()

05-11 06:11:39.103 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onResume()



05-11 06:11:44.391 1060-1060/com.hnpolice.xiaoke.activitylaunchmode
E/----A----: onPause()

05-11 06:11:44.427 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----B----: onCreate()

05-11 06:11:44.475 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----B----: onStart()

05-11 06:11:44.475 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----B----: onResume()

05-11 06:11:44.919 1060-1060/com.hnpolice.xiaoke.activitylaunchmode
E/----A----: onStop()



05-11 06:11:46.431 1060-1060/com.hnpolice.xiaoke.activitylaunchmode
E/----B----: onPause()

05-11 06:11:46.447 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----C----: onCreate()

05-11 06:11:46.459 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----C----: onStart()

05-11 06:11:46.459 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----C----: onResume()

05-11 06:11:46.851 1060-1060/com.hnpolice.xiaoke.activitylaunchmode
E/----B----: onStop()



05-11 06:11:47.303 1060-1060/com.hnpolice.xiaoke.activitylaunchmode
E/----C----: onPause()

05-11 06:11:47.327 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----D----: onCreate()

05-11 06:11:47.339 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----D----: onStart()

05-11 06:11:47.339 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----D----: onResume()

05-11 06:11:47.735 1060-1060/com.hnpolice.xiaoke.activitylaunchmode
E/----C----: onStop()



05-11 06:11:51.235 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----B----: onDestroy()

05-11 06:11:51.243 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----C----: onDestroy()



05-11 06:11:51.243 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----D----: onPause()

05-11 06:11:51.247 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onRestart()

05-11 06:11:51.247 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onStart()

05-11 06:11:51.247 1060-1060/com.hnpolice.xiaoke.activitylaunchmode E/----A----: onResume()

05-11 06:11:51.619 1060-1060/com.hnpolice.xiaoke.activitylaunchmode
E/----D----: onStop()

05-11 06:11:51.619 1060-1060/com.hnpolice.xiaoke.activitylaunchmode
E/----D----: onDestroy()

这样的模式在开发中做程序退出的时候会用到。

一种俗称“懒人式”的程序退出方法。

就是把首界面的启动模式设置为singleTask.然后监听back键。

第一次提示“再按一次退出程序”,第二次就直接finish掉首界面。程序退出就完毕了。

第四种启动模式:singleInstance。这样的模式就是singleTask的加强模式。

除了singleTask的全部特性之外。还规定了这样的模式的Activity仅仅能单独的位于一个任务栈中。

大家看完要是不明确能够看看这个。这里有篇文章http://blog.csdn.net/liuhe688/article/details/6754323。比較具体的介绍了Activity的launchMode。

欢迎评论,吐槽,拍砖。假设认为写的不错的话帮忙顶起来,谢谢。

友情链接:

假设你还不是非常了解Acitivity的生命周期的话能够点这里:

Activity的生命周期具体解释http://blog.csdn.net/lxk_1993/article/details/50731594

前面提到的程序退出的方法链接,

Android退出应用最优雅的方式:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402499969&idx=2&sn=c74c57d582fee85cc990ee086e7a1c40&scene=23&srcid=0111jJrFATyWZ1wTod0N1L1R#rd

android开发艺术探索学习 之 结合Activity的生命周期了解Activity的LaunchMode的更多相关文章

  1. Android开发艺术探索学习笔记(一)

    第一章 Activity的生命周期和启动模式 1.1Activity的生命周期全面解析 1.1.1典型情况下的生命周期分析 (1)在两个Activity进行切换时,当前的Activity的onPaus ...

  2. Android开发艺术探索学习笔记(三)

    第三章  View的事件体系 3.1 View基础知识 3.1.1 什么是view View 是Android中所有控件的基类,是一种界面层的控件的一种抽象,它代表了一个控件. 3.1.2 View的 ...

  3. Android开发艺术探索学习笔记(四)

    第四章 View的工作原理 4.1初识ViewRoot和DecorView ViewRoot是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成 ...

  4. Android开发艺术探索学习笔记(十一)

    第十一章  Android的线程和线程池 从用途上来说,线程分为子线程和主线程,主线程主要处理和界面相关的事情,而子线程往往用于执行耗时的操作.AsyncTask,IntentService,Hand ...

  5. Android开发艺术探索学习笔记(十)

    第十章  Android的消息机制 面试中经常会被问到的一个问题:handler是如何在子线程和主线程中进行消息的传递的,这个问题通过了解Android的消息机制可以得到一个准确的答案. Androi ...

  6. Android开发艺术探索学习笔记(六)

    第六章 Android的Drawable  Drawable的优点:使用简单,比自定义view的成本要低:非图片类型的Drawable占用空间小,有利于减小APK安装包的大小. 6.1Drawable ...

  7. Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式

    Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activ ...

  8. Android开发艺术探索读书笔记——01 Activity的生命周期

    http://www.cnblogs.com/csonezp/p/5121142.html 新买了一本书,<Android开发艺术探索>.这本书算是一本进阶书籍,适合有一定安卓开发基础,做 ...

  9. Android开发艺术探索笔记之Activity

    内容来源:Android开发艺术探索第一章:Activity的生命周期与启动模式 不能在onPause中做重量级的操作,因为必须执行完成以后新Activity才能Resume.onPause和onSt ...

随机推荐

  1. linux 复 带进度条

    rsync命令 #rsync -av --progress /mnt/yidong2/full20100526.tar.gz /mnt/yidong1/ 可以实现本机带进度条提示拷贝,可以实现不同机器 ...

  2. POJ 2115 C Looooops&lpar;扩展欧几里得&rpar;

    辗转相除法(欧几里得算法) 时间复杂度:在O(logmax(a, b))以内 int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a ...

  3. linux指令大全&lpar;完整篇&rpar;(转)

       http://blog.chinaunix.net/uid-9681606-id-1998590.html  linux指令大全(完整篇)(转) 2009-03-17 01:21:46 分类:  ...

  4. DES、AES、TEA加密算法的比较

    1.     DES算法介绍: DES算法具有对称性, 既可以用于加密又可以用于解密.对称性带来的一个很大的好处在于硬件实现, DES 的加密和解密可以用完全相同的硬件来实现.DES 算法的明文分组是 ...

  5. File类与FileInfo类区别

    ile类是静态的,FileInfo不是静态的也没有静态的方法,仅可用于实例化的对象.FileInfo方法基本类似于File.关于二者,作何选择. ● 如果仅进行单一方法调用,则可以使用静态File类上 ...

  6. Go - concurrency

    并发 vs 并行 首先,我们先来搞清楚概念以及并发和并行的区别. 并发 - 利用时间片切换来实现“同时”运行的. 并行 - 利用CPU的多核来实现通过多线程来实现同时运行. Go 语言的设计理念就是通 ...

  7. HTTP简单解析

    一.简介 HTTP是一种基于TCP/IP的超文本传输协议,用于从WWW服务器传输超文本到本地浏览器. HTTP是一种基于客户端/服务器(C/S架构)的无状态.无连接.媒体独立的传输协议. HTTP是一 ...

  8. 第十三节,卷积神经网络之经典网络LeNet-5、AlexNet、VGG-16、ResNet&lpar;三&rpar;&lpar;后面附有一些网络英文翻译文章链接&rpar;

    一 实例探索 上一节我们介绍了卷积神经网络的基本构建,比如卷积层.池化层以及全连接层这些组件.事实上,过去几年计算机视觉研究中的大量研究都集中在如何把这些基本构件组合起来,形成有效的卷积神经网络.最直 ...

  9. 目标检测中的mAP

    一.IOU的概念 交集和并集的比例(所谓的交集和并集,都是预测框和实际框的集合关系).如图: 二.Precision(准确率)和Recall(召回率)的概念 对于二分类问题,可将样例根据其真实类别和预 ...

  10. Visual Studio for Mac 使用笔记

    无法打开控制台运行程序 Project -> Project Options -> Run -> Configurations -> Default 勾选Run on exte ...