android四種啟動模式
1. Android singleinstance在什麼情況下使用
在Android中每個界面都是一個Activity,切換界面操作其實是多個不同Activity之間的實例化操作。在Android中Activity的啟動模式決定了Activity的啟動運行方式。 Android總Activity的啟動模式分為四種: Activity啟動模式設置: Activity的四種啟...
2. 請使用文字描述activity有幾種+啟動模式,並說明這幾種模式+的特點和區別。
摘要 基於stm32貪吃蛇游戲
3. android 登陸頁面用什麼啟動模式
在Android中每個界面都是一個Activity,切換界面操作其實是多個不同Activity之間的實例化操作。在Android中Activity的啟動模式決定了Activity的啟動運行方式。
Android總Activity的啟動模式分為四種:
Activity啟動模式設置:
<activity android:name=".MainActivity" android:launchMode="standard" />
Activity的四種啟動模式:
1. standard
模式啟動模式,每次激活Activity時都會創建Activity,並放入任務棧中。
2. singleTop
如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,否者就會創建新的實例並放入棧頂(即使棧中已經存在該Activity實例,只要不在棧頂,都會創建實例)。
3. singleTask
如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的onNewIntent())。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移除棧。如果棧中不存在該實例,將會創建新的實例放入棧中。
4. singleInstance
在一個新棧中創建該Activity實例,並讓多個應用共享改棧中的該Activity實例。一旦改模式的Activity的實例存在於某個棧中,任何應用再激活改Activity時都會重用該棧中的實例,其效果相當於多個應用程序共享一個應用,不管誰激活該Activity都會進入同一個應用中。
其中standard是系統默認的啟動模式。
下面通過實例來演示standard的運行機制:
1 private TextView text_show;
2 private Button btn_mode;
3
4 @Override
5 public void onCreate(Bundle savedInstanceState) {
6 super.onCreate(savedInstanceState);
7 setContentView(R.layout.activity_main);
8
9 text_show = (TextView) this.findViewById(R.id.text_show);
10
11 text_show.setText(this.toString());
12
13 btn_mode = (Button) this.findViewById(R.id.btn_mode);
14
15 }
16
//按鈕單擊事件
17 public void LaunchStandard(View v){
18 startActivity(new Intent(this,MainActivity.class));
19
20 text_show.setText(this.toString());
21 }
4. 點擊第二個fragment 第一個fragment為什麼populwindon還在界面上
Activity的四種啟動模式和onNewIntent()
Android中Activity啟動模式詳解
在Android中每個界面都是一個Activity,切換界面操作其實是多個不同Activity之間的實例化操作。在Android中Activity的啟動模式決定了Activity的啟動運行方式。
Android總Activity的啟動模式分為四種:
java代碼
Activity啟動模式設置:
<activity android:name=".MainActivity" android:launchMode="standard" />
Activity的四種啟動模式:
1. standard
默認啟動模式,每次激活Activity時都會創建Activity,並放入任務棧中,永遠不會調用onNewIntent()。
2. singleTop
如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,並調用其onNewIntent(),否者就會創建新的實例並放入棧頂(即使棧中已經存在該Activity實例,只要不在棧頂,都會創建實例,而不會調用onNewIntent(),此時就跟standard模式一樣)。
3. singleTask
如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的onNewIntent())。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移除棧。如果棧中不存在該實例,將會創建新的實例放入棧中(此時不會調用onNewIntent())。
4. singleInstance
在一個新棧中創建該Activity實例,並讓多個應用共享改棧中的該Activity實例。一旦改模式的Activity的實例存在於某個棧中,任何應用再激活改Activity時都會重用該棧中的實例,其效果相當於多個應用程序共享一個應用,不管誰激活該Activity都會進入同一個應用中。
大家遇到一個應用的Activity供多種方式調用啟動的情況,多個調用希望只有一個Activity的實例存在,這就需要Activity的onNewIntent(Intent intent)方法了。只要在Activity中加入自己的onNewIntent(intent)的實現加上Manifest中對Activity設置lanuchMode=「singleTask」就可以。
onNewIntent()非常好用,Activity第一啟動的時候執行onCreate()---->onStart()---->onResume()等後續生命周期函數,也就時說第一次啟動Activity並不會執行到onNewIntent(). 而後面如果再有想啟動Activity的時候,那就是執行onNewIntent()---->onResart()------>onStart()----->onResume(). 如果android系統由於內存不足把已存在Activity釋放掉了,那麼再次調用的時候會重新啟動Activity即執行onCreate()---->onStart()---->onResume()等。
當調用到onNewIntent(intent)的時候,需要在onNewIntent() 中使用setIntent(intent)賦值給Activity的Intent.否則,後續的getIntent()都是得到老的Intent。
如果還有更好的辦法,請相互交流,非常感謝!!!歡迎轉載!!!
===============================更新時間,2016年3月9日17:08:34==========================================
上述的描述的確是解決了點擊了通知欄消息跳轉到指定的fragment界面,但如果是這樣的情況,當發了一條通知之後,用戶點擊退出程序,再次點擊通知欄的時候,onnewintent方法進不去,跳轉到主界面activity,由於此時還沒有指定界面,所以會有很多異常,所以我們需要判斷是否已經退出程序,當點擊通知欄判斷已經退出程序的時候,跳轉回登陸界面,如下代碼:
[java] view plain print?
// 當程序退出之後,點擊通知欄消息跳轉時,需要進行判斷是否已經退出,跳轉到登陸界面
if (!ClientAPI.getInstance().isDocInited()) {
Intent intentGCM = new Intent(FragmentManagerActivity.this,
LoginActivity.class);
startActivity(intentGCM);
}
5. activity的啟動模式有哪些
Activity的四種啟動模式:standard:這是默認模式,每次激活Activity時都會創建Activity實例,並放入任務棧中。
singleTop: 如果在任務的棧頂正好存在該Activity的實例,就重用該實例( 會調用實例的 onNewIntent() ),否則就會創建新的實例並放入棧頂,即使棧中已經存在該Activity的實例,只要不在棧頂,都會創建新的實例。
singleTask:如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的 onNewIntent() )。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移出棧。如果棧中不存在該實例,將會創建新的實例放入棧中。
singleInstance:在一個新棧中創建該Activity的實例,並讓多個應用共享該棧中的該Activity實例。一旦該模式的Activity實例已經存在於某個棧中,任何應用再激活該Activity時都會重用該棧中的實例( 會調用實例的 onNewIntent() )。其效果相當於多個應用共享一個應用,不管誰激活該 Activity 都會進入同一個應用中。
位置在 AndroidManifest.xml 文件中 Activity 元素的 android:launchMode 屬性。
6. Android 深入探討sigleTask和singletop的區別
1.singleTask和singletop都是保真了Activity在棧中的唯一性
2.singleTask和singleTop實例存在時,都不會重新創建 new task
不同之處有如下幾點:
如果singleTask啟動的ActivityA位於棧底,在棧頂startActivity到這個ActivityA時會調動
onNewIntent->onStart->onResume。
但singleTask啟動的的ActivityA不存在時,會重新創建ActivityA,調用方式OnCreate->OnStart->OnResume
2.如果singletop啟動的ActivityB在棧底時,在棧頂startActivity到這個ActivityB時會重新調動
onCreate->onStart->onResume,但不會調用OnDestroy
並且singletop啟動的的ActivityB不存在時,會重新創建ActivityB,調用方式OnCreate->OnStart->OnResume
3.singleTask在棧底時,從棧頂startActivity到棧底ActivityA,那麼該棧startActivity的發起者的中間部分Activity會被銷毀。而singletop是逐級跳躍到棧頂
singleTask
追加一點singleInstance,雖然也是保證唯一性,但改模式的Activity是全局性的唯一性,生命周期和應用程序相同,不能及時回收,此外的話Activity在MVC充當Controller的角色,
這點顯然對singleIntance來說不適合,因此不建議使用。
4.singleTask不適合充當ChildActivity,但singletop適合
5.對作業棧,默認情況下,沒有任何影響,因為棧的taskid是相同的,可以獲取getTaskid(),默認情況下每個activity的taskid相同
但是,如果自定義了棧的標簽(這個標簽相同的singletask activity在同一個作業棧中),那麼taskid就會初選差別
android:taskAffinity="com.sample.lanchmode.tester.main",那麼一旦另一個作業棧被銷毀,下次必然重建(相信我,這不是廢話)。
為了一句不是廢話,我需要來證明一下。
當我們的初始載入WelcomeActivity界面--->HomeActivity界面時,如果將HomeActivity的啟動模式設置為sigleTask+android:taskAffinity="自定義(一般是類名)",
①那麼WelcomeActivity銷毀後,在到達HomeActivity之後,HomeActivity回作為一個新的作業棧棧底而存在,所以由HomeActivity啟動的Activity的TaskId和HomeActivity相同。
②這個過程,WelcomeActivity和HomeActivity的TaskId是不相同的,問題出現了,當我們按下 Home鍵,然後在點擊桌面上的app圖標你會發現,WelcomeActivity再次出現了,
而且再次進入了HomeActivity,並且這個HomeActivity調用了OnNewIntent,卻沒掉用OnCreate,所以來說他一直存在這,但你需要再次過渡才能找到它。
(對於追求捕獲Home鍵讓app退出的讀者是一個喜訊,這樣可以做到每次Home之後都能再次進入登錄界面),在這個過程中沒有直接進入HomeActivity,而是WelcomeActivity(有人說不對么,不應該是這樣么,在這里不想解釋)。
注意,使用了不同作業棧的Activity,會在最近打開的app顯示一個應用會出現2個界面。
在這里,需要強調一下singleTask+android:taskAffinity不一定必須使用,請依據需求而定,網上有人推薦使用,但我卻想說,不要盲目,並不是所有的應用都適合。
1-->
singleTask+android:taskAffinity對於效率而言,優勢並不存在,比如設置進程的,但對於帶有登錄狀態的app需要慎用,否則造成信息泄露等問題,開發中只使用singleTask即可。
2-->
singleTask+android:taskAffinity適用於單用戶保密性的app(可做到Home之後下次必須登錄才能查看信息),建議在這方面試試。
轉載
7. Activity的啟動模式有哪幾種,分別用於什麼
剛好最近又梳理了一下,結合我的實際使用場景回答一下= =
有四種啟動模式,需要知道的是activity是交由activity棧(任務棧)管理的
standard:會在啟動時創建一個新實例入棧,所以每次打開都是一個新的界面
場景:默認模式,一般的activity用這個就好
singleTop:當啟動activity時,有相同的activity在前台與用戶交互,就復用這個activity,回調onNewIntent()方法,避免棧頂的activity被重復的創建;如果沒在棧頂,依然會創建新的實例加在棧頂
場景:這個主要針對重復打開的情況,比如你點擊通知欄,跳轉到消息中心,如果此時消息中心已經打開,就不會重新打開新的界面,合乎邏輯
singleTask:類似singleTop,也是避免重復創建,唯一不同的是,當啟動activity時,有相同的activity在棧內,會復用此activity,回調onIntent(),並清空此activity之上所有activity
場景:一般用於程序主界面,利用清空activity的特性,比如你在應用內,打開了多個界面,觸發了某個操作後都需要跳轉到首頁,設置了singleTask之後,就直接啟動主頁就好,會把之前打開的全部關掉(免得你手動一個一個關閉activity)
singleInstance:顧名思義,單一實例,整個手機操作系統裡面只有一個實例存在。不同的應用去打開這個activity 共享公用的同一個activity
場景:常見於系統呼叫來電界面,每個應用打開不會重新創建新的該撥打界面。這種模式比較少用,除非你確定需要使該Activity只有一個實例
最後,上面介紹是在默認沒有指定taskAffinity的情況下(即包名),具體想要更深入或者實現更復雜的場景,請結合taskAffinty和Intent Flag具體分析,在此就不介紹了。
以上。
8. 如何很好的理解安卓的四種開發模式
安卓中的是四種啟動模式分別為standerd,singletop,singletask,singleInstance。
standerd是標准啟動模式,也就是默認的啟動的模式。這種模式每次都會創建一個新的實例,在退出的時候在分別出棧。
singleTop每次創建時,會先看看棧中的棧頂有沒有改實例,如果有就拿來用,沒有就自己創建。
9. Activity四種啟動模式有哪些
Activity的啟動模式可以通過AndroidManifest.xml文件中的<activity>元素的屬性來指定,一共有4中模式:
<activity android:name="ActivityMain" android:launchMode="singleTask"></activity>
1 standard
2 singleTop
3 singleTask
4 singleInstance
這4中模式又分兩類,standard和signleTop屬於一類, singleTask和signleInstance屬於另一類。
standard和singleTop屬性的 Activity 的實例可以屬於任何任務(Task),並且可以位於Activity堆棧的任何位置。比較典型的一種情況是,一個任務的代碼執行 startActivity(),如果傳遞的 Intent 對象沒有包含 FLAG_ACTIVITY_NEW_TASK 屬性, 指定的 Activity 將被該任務調用,從而裝入該任務的Activity 堆棧中。 standard和singleTop的區別在於:standard模式的Activity在被調用時會創建一個新的實例,所有實例處理同一個 Intent對象; 但對於singleTop模式的Activity,如果被調用的任務已經有一個這樣的Activity 在堆棧的頂端,那麼不會有新的實例創建, 任務會使用當前頂端的Activity實例來處理Intent對象,換句話說,如果被調用的任務包含一個不在堆棧頂端的 singleTop Activity, 或者堆棧頂端為 singleTop 的Activity的任務不是當前被調用的任務,那麼,仍然會有一個新的Activity對象被創建。
singleTask 和 singleInstance模式的Activity 僅可用於啟動任務的情況, 這種模式的Activity總是處在Activity堆棧的最底端,並且一個任務中只能被實例化一次。兩 者的區別在於:對於 singleInstance模式的Activity, 任務的Activity堆棧中如果有這樣的Activity,那它將是堆棧中的唯一的 Activity, 當前任務收到的 Intent 都由它處理, 由它開啟的其他 Activity 將在其他任務中被啟動; 對於 SingleTask模式的Activity,它在堆棧底端,其上方可以有其他Activity被創建, 但是,如果發給該Activity的Intent對象到來時該Activity不在堆棧頂端,那麼該Intent對象將被丟棄,但是界面還是會切換到當前 的Activity。
在多Activity開發中,有可能是自己應用間的activity 跳轉,或者夾帶其他應用的可復用activity。可能會希望跳轉到原來某個activity實例,而非產生多個重復的activity。我們可藉助 activity 四種啟動模式來實現不同的需求:
standard 默認模式 --------- 來了intent,每次都創建新的實例。
singleTop -------- 來了intent, 每次都創建新的實例,僅一個例外:當棧頂的activity 恰恰就是該
activity的實例(即需要創建的實例)時,不再創建新實例。這解決了棧頂復用問題,想一想,你按兩次back鍵,退出的都是同一個activity,這感覺肯定不爽。
singleTask ---------- 來了intent後,檢查棧中是否存在該activity的實例,如果存在就把intent發送給它,否則就創建一個新的該activity的實例,放入 一個新的task棧的棧底。肯定位於一個task的棧底,而且棧中只能有它一個該activity實例,但允許其他activity加入該棧。解決了在一 個task中共享一個activity。
singleInstance ----------- 肯定位於一個task的棧底, 並且是該棧唯一的activity。解決了多個task共享一個activity。