iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 9
0
Software Development

Kotlin 2018連續開發30天系列 第 9

Kotlin 2018連續開發30天 day 8 Activity的啟動模式

  • 分享至 

  • twitterImage
  •  

  1. Standard模式(標準模式)
  2. SingleTop
  3. SingleTask
  4. SingleInstance(單例模式)

為什麼要研究啟動模式

  1. 有時候我們的App需要生成给其他App調用的Activity,例如遊覽器應用,照相機應用
  2. 解決生成重複頁面等等Bug
  3. 排程過深的时候,避免一直按返回键也退不回想要的頁面

使用方法

Androidmanifest中修改

    <activity android:name=".MainActivity"
        android:launchMode="standard">

Standard模式(標準模式)

每次啟動都會創建Activity實體

標準啟動模式,也是activity的默認啟動模式。在這種模式下啟動的activity可以被多次實體化,即在同一個任務中可以存在多個activity的實體,每個實體都會處理一个Intent對象。如果Activity A的啟動模式為standard,並且A已经啟動,在A中再次啟動Activity A,即調用startActivity(new Intent(this,A.class)),會在A的上面再次啟動一個A的實體,即當前的排程的狀態為A-->A。

(每啟動一次Activity,就會創建一個新的Activity實體並置于前台 誰啟動了這個Activity,那麼這個Activity就運行在啟動它的那個Activity所在的排程中。如Activity A启动了Activity B(標準模式),那麼B就會進入到A的排程中 )
啟動Activity基本指令為StartActivity() 參數為Intent


SingleTop


如果要開啟的activity在排程的頂部已經存在,就不創建新的實體,而是調用 onNewIntent() 方法。避免排程頂部的activity被重复的創建。

如果一個以singleTop模式啟動的activity的實體已經存在于排程的最前面,那麼再啟動這個Activity時,不會創建新的實體,而是重用位于排程頂端的實體,並且會調用該實體的onNewIntent()方法將Intent對象傳遞到這個實體中。舉例來說,如果A的啟動模式為singleTop,並且A的一個實體已經存在排程中,那麼再調用startActivity(new Intent(this,A.class))啟動A時,不會再次創建A的實體,而是重用原来的實體,並且調用原来實體的onNewIntent()方法。這是排程中還是這有一個A的實體。
如果以singleTop模式啟動的activity的一個實體已经存在與排程中,但是不在前台,那麼它的行為和standard模式相同,也會創建多個實體。

實例(ㄧ)消息推送
通知欄彈出Notification,點擊Notification跳轉到指定Activity,但是如果我現在頁面就停留在那個指定的Activity,會再次打開我當前的Activity,這樣返回的时候回退的頁面和當前頁面一樣,感官上就會很奇怪。

實例(二)登錄頁面
登陸成功跳轉到主頁,按下兩次登陸按钮,生成了兩個主頁。一些有啟動延遲的页面(往往是動畫,網路造成)也會有這樣的情况。

實例(三)耗時操作返回頁面
activity A啟動了个service進行耗時操作,或者某種監聽,這個时候你按下home鍵了,service收集到信息,要返回activityA了,就用singleTop啟動,實際不會創建新的activityA,只是resume了。不過使用standard又會創造2個activityA的實體。


SingleTask


google的官方文件上,如果一個activity的啟動模式為singleTask,那麼系统總會在一個新任務的最底部(root)啟動這個activity,並且被這個activity啟動的其他activity會和該activity同時存在於這個新任務中。如果系统中已經存在這樣的一個activity則會重用這個實體,並且調用他的onNewIntent()方法。這樣的一個activity在系统中只會存在一個實體。

如果要啟動的Activity在當前排程啟動,activity只會在排程裡面存在一個實體。如果要啟動的activity,在排程裡面已经存在,就不會創建新的activity,而是重新啟用這個已經存在的activity,調用 onNewIntent() 方法,並且清空這個activity排程上面所有的activity。


SingleInstance(單例模式)

總是在新的任務中開啟,並且這個新的任務中有且只有這一個實體,也就是說被該實體啟動的其他activity會自動運行于另一個任務中。當再次啟動该activity的實體時,會重用已存在的任務和實體。並且會調用這個實體的onNewIntent()方法,將Intent實體傳遞到實體中。和singleTask相同,同一時刻在系统中只會存在一個這樣的Activity實體。


上一篇
Kotlin 2018連續開發30天 day 7 android 第三方工具 mpandroidchart-RadarChart
下一篇
Kotlin 2018連續開發30天 day 9 android 指紋辨識系統撰寫
系列文
Kotlin 2018連續開發30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言