1. 程式人生 > >android開發藝術探索學習 之 結合Activity的生命周期了解Activity的LaunchMode

android開發藝術探索學習 之 結合Activity的生命周期了解Activity的LaunchMode

友情 dsm ask resume () new onstop androi sum

轉載請標明出處:

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