zoukankan      html  css  js  c++  java
  • android开发艺术探索学习 之 结合Activity的生命周期了解Activity的LaunchMode

    转载请标明出处: 

    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

  • 相关阅读:
    dp,路径保存,最大公共上升子序列——ZOJ
    简单dp——HDU
    扫描线,线段树,离散化——HDU
    c++版本的opencv3.4.1里分类器输出值异常
    win10家庭版openssh连接远程服务器显示connetion reset
    生活感悟一
    Teradata简介
    kettle 无法正常启动问题
    kettle实现同构单表增量同步
    kettle数据库连接使用变量
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7136746.html
Copyright © 2011-2022 走看看