⑴ android中,由Activity啟動一個Service,Service如何獲得啟動它的Activity對象
在service中做一個activity的集合
再做一個addActivity的方法和findActivity的方法
將你需要調攔毀羨用handler的activity通過簡拍addActivity方余跡法放到service的activity集合中
需要用的時候用findActivity從activity把那個對象取出來
⑵ Android Service啟動Activity
Android Service 基礎知識點
我們都知道Activity中啟動Activity,只需要startActivity,如果在Service中啟動Activity呢?
在Service中啟動Activity,很多人說在非Activity中啟動Activity需要加FLAG_ACTIVITY_NEW_TASK flag,如果我不加會怎麼樣呢?
並沒有出現異常和崩潰,跳轉也是正常的,但是與之前所說的會崩潰報出異常不符合啊?!難道是與版本有關嗎?大友於是我使用了Android 23去測試果然拋出了異常
ContextImpl在Android studio中屬於隱藏源碼,在IDE中可能看不到,那就需要在SDK中去找 我的是:D:\AndroidSdk\sources\android-23\android\app\ContextImpl.java
可以看到只是判斷條件不同而已,android-23中發現沒有Intent.FLAG_ACTIVITY_NEW_TASK會直接拋出異常,而android-26中我們在非 Activity 調用 startActivity() 的時候,我們這個 options 通常是 null 的,所以在 26 之間的時候,誤把判斷條件 options == null 寫成了 options != null 導致進不去 if,從而不會拋出異常
附加:在android 24-android 27(即android N-android O)之間出現了bug,也就是說即使沒有加Intent.FLAG_ACTIVITY_NEW_TASK也會正常跳轉激仿銷
可以很明顯看到判斷條件targetSdkVersion <明游 Build.VERSION_CODES.N || targetSdkVersion >= Build.VERSION_CODES.P 即在24-27
看Activity中啟動Activity的源碼
Activity.startActivity() ->startActivityForResult()->mInstrumentation.execStartActivity() ...最終還是Ams去啟動Activity 也就是Activity中重寫了startActivity()方法所以不會出現這個異常
其實直觀很好理解,如果不是在Activity中啟動的,那就可以看做不是用戶主動的行為,也就說這個界面可能出現在任何APP之上,如果不用Intent.FLAG_ACTIVITY_NEW_TASK將其限制在自己的Task中,那用戶可能會認為該Activity是當前可見APP的頁面,這是不合理的。舉個例子:我們在聽音樂,這個時候如果郵件Service突然要打開一個Activity,如果不用Intent.FLAG_ACTIVITY_NEW_TASK做限制,那用戶可能認為這個Activity是屬於音樂APP的,因為用戶點擊返回的時候,可能會回到音樂,而不是郵件(如果郵件之前就有界面)
對比源碼發現,在我們非 Activity 調用 startActivity() 的時候,我們這個 options 通常是 null 的,所以在 24~27 之間的時候,誤把判斷條件 options == null 寫成了 options != null 導致進不去 if,從而不會拋出異常,如此我們使用 Context.startActivity() 的時候是一定要加上 FLAG_ACTIVITY_NEW_TASK 的,但是在 Android N 到 O-MR1,即 24~27 之間卻出現了 bug,即使沒有加也會正確跳轉
結語:感謝各位大佬的分享,對此有疑問的可以去運行跑一下,看一下相關的源碼,如有錯誤的需要改進的地方,請留言評論指出,謝謝!
參考文章:
⑶ Android應用設置啟動Activity
打開app/src/main目錄下的AndroidManifest.xml文件,修改以下內容
在需要啟動的activity中添加以下內容
更多內容點此查看。
⑷ Android —— Activity的四種啟動模式
除了Activity的生命周期外,Activity的啟動模式也是一個難點,有時候為了滿足項目的特殊需求,就必須使用Activity的啟動模式。
在默認情況下,當我們多次啟動同一個Activity的時候,系統會創建多個實例並把它們放入任務棧中,但是有些場景重復創建多個實例,是沒有必要且浪費資源的,這就需要啟動模式來修改系統的默認行為。
下面,我將以理論+實踐的形式為大家介紹Activity的啟動模式。
這是系統的默認啟動模式,採用這種模式的Activity無論是否已經存在實例,都會重新創建一個實例,在這種模式下誰啟動了這個Activity,那麼這個Activity就運行在啟動它的那個Activity所在的棧中。
實踐:MainActivity 採用 standard 模式
在這種模式下,如果新的Activity已經位於任務棧的棧頂,那麼此Activity不會被重新創建,同時它的 NewIntent 方法將會被回調。如果新Activity的實例已存在但不是位於棧頂,那麼新Activity依然會被創建。
實踐:MainActivity 採用 singleTop 模式
MainActivity 採用 singleTop 模式,SecondActivity採用 standard 模式
這是一種單實例模式,在這種模式下,只要Activity在一個棧中存在,那麼多次啟動此Activity都不會重新創建實例,而是回調 onNewIntent() 。
實踐:MainActivity 採用 singleTask 模式
MainActivity 採用 singleTask 模式,SecondActivity採用 standard 模式
這是一種加強的 singleTask 模式,它除了具有 singleTask 模式的所有特性外,還加強了一點,那就是具有此模式的Activity只能單獨的位於一個任務棧中。
實踐:MainActivity 採用 singleInstance 模式
MainActivity 採用 singleInstance 模式,SecondActivity採用 standard 模式
以上就是Activity啟動模式的介紹。
歡迎留言指出錯誤。
⑸ Android Activity啟動模式與狀態保存及恢復詳解
Activity是 Android組件 中最基本也是最為常見用的四大組件(Activity,Service服務,Content Provider內容提供者,BroadcastReceiver廣播接收器)之一 。
Activity是一個應用程序 組件 ,提供一個 屏幕 ,用戶可以用來交互為了完成某項任務。
Activity中所有操作都與用戶密切相關,是一個負責與 用戶交互 的組件,可以通過setContentView(View)來 顯示指定控制項 。
在一個android應用中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控制項也可以監聽並處理用戶的事件做出響應。Activity之間通過Intent進行通信。
關於Activity啟動流程請參考之前的文章 Android activity啟動流程分析
activity有四種啟動模式,分別為standard,singleTop,singleTask,singleInstance。如果要使用這四種啟動模式,必須在manifest文件中<activity>標簽中的launchMode屬性中配置。
標準的默認啟動模式,這種模式下activity可以被多次實例化,即在一個task中可以存在多個activity,每一個activity會處理一個intent對象,(在A中再次啟動A,會存在後面的A在前面的A上面,當前task會存在兩個activity的實例對象)
如果一個singleTop模式啟動的activity實例已經存在於棧頂,那麼再次啟動這個activity的時候,不會重新創建實例,而是重用位於棧頂的那個實例,並且會調用實例的onNewIntent()方法將Intent對象傳遞到這個實例中,如果實例不位於棧頂,會創建新的實例。
啟動模式設置為singleTask,framework在啟動該activity時只會把它標示為可在一個新任務中啟動,至於是否在一個新任務中啟動,還要受其他條件的限制,即taskAffinity屬性。
taskAffinity :默認情況下,一個應用中的所有activity具有相同的taskAffinity,即應用程序的包名。我們可以通過設置不同的taskAffinity屬性給應用中的activity分組,也可以把不同的應用中的activity的taskAffinity設置成相同的值,當兩個不同應用中的activity設置成相同的taskAffinity時,則兩個activity會屬於同一個TaskRecord。
在啟動一個singleTask的Activity實例時,如果系統中已經存在這樣一個實例,就會將這個實例調度到任務棧的棧頂,並清除它當前所在任務中位於它上面的所有的activity;如果這個已存在的任務中不存在一個要啟動的Activity的實例,則在這個任務的頂端啟動一個實例;若這個任務不存在,則會啟動一個新的任務,在這個新的任務中啟動這個singleTask模式的Activity的一個實例。
以singleInstance模式啟動的Activity具有全局唯一性,即整個系統中只會存在一個這樣的實例,如果在啟動這樣的Activiyt時,已經存在了一個實例,那麼會把它所在的任務調度到前台,重用這個實例。
以singleInstance模式啟動的Activity具有獨占性,即它會獨自佔用一個任務,被他開啟的任何activity都會運行在其他任務中(官方文檔上的描述為,singleInstance模式的Activity不允許其他Activity和它共存在一個任務中)。
被singleInstance模式的Activity開啟的其他activity,能夠開啟一個新任務,但不一定開啟新的任務,也可能在已有的一個任務中開啟,受條件的限制,這個條件是:當前系統中是不是已經有了一個activity B的taskAffinity屬性指定的任務。
涉及到Activity啟動,就不得不說一下Activity的管理,Activity是以什麼方式及被什麼類來進行管理的,涉及的類主要如下:
歷史棧中的一個條目,代表一個activity。ActivityRecord中的成員變數task表示其所在的TaskRecord,ActivityRecord與TaskRecord建立了聯系。
內部維護一個 ArrayList<ActivityRecord> 用來保存ActivityRecord,TaskRecord中的mStack表示其所在的ActivityStack,TaskRecord與ActivityStack建立了聯系。
內部維護了一個 ArrayList<TaskRecord> ,用來管理TaskRecord,ActivityStack中持有ActivityStackSupervisor對象,由ActivityStackSupervisor創建。
負責所有ActivityStack的管理。內部管理了mHomeStack、mFocusedStack和mLastFocusedStack三個Activity棧。其中,mHomeStack管理的是Launcher相關的Activity棧;mFocusedStack管理的是當前顯示在前台Activity的Activity棧;mLastFocusedStack管理的是上一次顯示在前台Activity的Activity棧。
ActivityThread 運行在UI線程(主線程),App的真正入口。
用來實現AMS和ActivityThread之間的交互。
負責調用Activity和Application生命周期。
當一個Activity未被主動關閉,即「被動關閉」時,可能需要系統給用戶提供保持一些狀態的入口。
前面說的入口就是:Activity提供了onSaveInstanceState()方法,該方法是Activity在關閉前保存狀態的核心方法。
前面提到「被動關閉」,如果是主動關閉那麼就不會調用,比如:按back鍵、調用finish()等,那麼"被動關閉"的場景有哪些呢?下面給列舉一下:
肯定在調用onStop()前被調用,但不保證在onPause()前 / 後,一般是在onPause()後調用。
當需要保持狀態時,在onSaveInstanceState()內執行以下邏輯:
當需要恢復時,在onCreate()內部執行以下邏輯:
布局每個View默認實現:onSaveInstanceState(),即UI的任何改變都會自動的存儲和在activity重新創建的時候自動的恢復(只有在為該UI提供了唯一ID後才起作用);
若需復寫該方法從而存儲額外的狀態信息時,應先調用父類的onSaveInstanceState()(因為默認的onSaveInstanceState()幫助UI存儲它的狀態);
只使用該方法記錄Activity的瞬間狀態(UI的狀態),而不是去存儲持久化數據,因為onSaveInstanceState()調用時機不確定性;可使用 onPause()[一定會執行]存儲持久化數據;
Activity提供了onRestoreInstanceState()方法,該方法是Activity在重新創建後恢復之前保存狀態的核心方法。
若被動關閉了Activity,即調用了onSaveInstanceState(),那麼下次啟動時會調用onRestoreInstanceState()。
onCreate()--->onStart()--->onRestoreInstanceState()--->onResume()
注意: onSaveInstanceState()、onRestoreInstanceState()不一定 成對被調用
如:當正在顯示Activity A時,用戶按下HOME鍵回到主界面,然後用戶緊接著又返回到Activity A,此時Activity A一般不會因為內存的原因被系統銷毀,故Activity A的onRestoreInstanceState()不會被執行;
針對以上情況,onSaveInstanceState保持的參數可以選擇在onCreate()內部進行解析使用,因為onSaveInstanceState的bundle參數會傳遞到onCreate方法中,可選擇在onCreate()中做數據還原。
至此:Activity的啟動模式及Activity的狀態保持及恢復介紹完畢。
⑹ android adb 啟動activity、service,發送broadcast等操作
android adb 啟動activity、service,發送broadcast等操作
一、adb啟動activity:
adb shellam start -n {包(package)名}/{包名}.{活動(activity)名稱}
如:啟動瀏覽器
adb shell am start -n com.android.browser/com.android.browser.BrowserActivity
二、adb關閉activity:
adb shellam force-stop {包(package)名}
如:關閉瀏覽器adb shellam force-stopcom.android.browser
三、adb啟動service:
adb shellam startservice -n{包(package)名}/此困{包名}.{服務(service)名稱}
如:啟動自己應用中一個service
adb shellam startservice -n com.android.traffic/com.android.traffic.maniservice
四、adb卸載應用程序:
adb uninstall{包(package)名}
如:卸載瀏森悄念覽器adbuninstallcom.android.browser
五、adb發送broadcast:
adb shellam broadcast -a <廣播動作>
如:發送一個網路變化的廣播
adb shellam broadcast -a android.net.conn.CONNECTIVITY_CHANGE
六、運纖adb埠轉發:
adb shell am broadcast -a NotifyServiceStop
adb forward tcp:12580 tcp:10086
adb shell am broadcast -a NotifyServiceStart
⑺ Android 10.0 ActivityManagerService的啟動流程
我們講完了SystemServer的啟動過程,本節主要來講解ActivityManagerService的啟動過程。ActivityManagerService簡稱AMS,管理Activity行為,控制Activity的生命周期,派發消息事件,內存管理等功能。
ActivityManagerService啟動由SystemServer中startBootstrapService啟動
ATM啟動最終調用的是ActivityTaskManagerService.Lifecycle.onStart()來啟動ATM服務的
源碼:ActivityTaskManagerService.java#Lifecycle.class
將ActivityTaskManagerInternal添加到本地服務的全局注冊表中。
ActivityTaskManagerInternal為抽象類,其實現類為ActivityTaskManagerService#LocalService.class
構造函數初始化主要工作就是初始化一些變數,供之後的service,broadcast,provider的管理和調度
start中做了兩件事
AMS的systemReady處理分為三個階段
同時獲取一些配置參數。 需要注意的是,由於只有Java進程才會向AMS注冊,而一般的Native進程不會向AMS注冊,因此此處殺死的進程是Java進程。
主要是調用一些關鍵服務的初始化函數,然後殺死那些沒有FLAG_PERSISTENT 卻在AMS啟動完成前已經存在的進程,同時獲取一些配置參數。需要注意的是,由於只有Java進程才會向AMS注冊,而一般的Native進程不會向AMS注冊,因此此處殺手的進程是Java進程。
執行goingCallback的處理,主要的工作就是通知一些服務可以進行systemReady相關的工作,並進行啟動服務或應用進程的工作
監控Native的crash,啟動WebView,執行一些服務的systemReady和systemRunning方法
啟動Home Activity,當啟動結束,發送ACTION_BOOT_COMPLETED廣播時,AMS的啟動過程告一段落
啟動Home Activity
AMS的啟動主要經歷了如下幾個階段:
⑻ android中的activity的啟動方式有哪幾種
Activity啟動模式有4種,分別為standard、singleTop、singleTask、singleInstance。
1.standard 默認模式,可以不用寫配置。在這個模式下,都會默認創建一個新的實例。因此,在這種模式下,可以有多個相同的實例,也允許多個相同Activity疊加。
2.singleTop 可以有多個實例,但是不允許多個相同Activity疊加。即,如果Activity在棧頂的時候,啟動相同的Activity,不會創建新的實例,而會調用其onNewIntent方法。
3.singleTask 只有一個實例。在同一個應用程序中啟動他的時候,若Activity不存在,則會在當前task創建一個新的實例,若存在,則會把task中在其之上的其它Activity destory掉並調用它的onNewIntent方法。
4.singleInstance只有一個實例,並且這個實例獨立運行在一個task中,這個task只有這個實例,不允許有別的Activity存在。
⑼ Activity的啟動流程
開發中我們會調用startActivity來啟動一個Activity,最終會調到 startActivityForResult :
Instrumentation 是Android系統裡面的一套控制方法或者「鉤子」。這些鉤子可以在正常的生命周期(正常是由操作系統控制的)之外控制Android控制項的運行。
Application和Activity的所有生命周期中,都會先調用Instrumentation提供的相應方法(如callActivityOnCreate,callApplicationOnCreate,newActivity,callActivityOnNewIntent)
Instrumentation.execStartActivity
ActivityTaskManager.getService()返回了一個IActivityTaskManager,拿到的是ATMS的代理對象,跨進程調用了ATMS的startActivity方法。
ActivityStarter.startActivityMayWait
ActivityStarter中做了一系列的調用(收集Intent信息,處理startActivityForResult,做一些校驗判斷等),最終進入startActivityUnchecked。
startActivityUnchecked
startActivityUnchecked中處理了關於Activity啟動模式的處理,接著真正的resume我們的Activity
這里會先判斷應用進程是否創建,創建了就進入 realStartActivityLocked ,沒創建就會調用 ActivityManagerInternal.startProcess
①熱啟動realStartActivityLocked
接著看ActivityThread中接收並處理消息的handleMessage
前面realStartActivityLocked方法中通過addCallback,傳入參數LaunchActivityItem。executeCallbacks方法中取出callbacks集合中的LaunchActivityItem,並調用其execute方法
handleLaunchActivity
②冷啟動創建應用進程ActivityManagerInternal.startProcess
ActivityManagerInternal的實現類是AMS中的LocalService,AMS通過Socket與Zygote通信,fork出App進程,app進程創建後,會執行ActivityThread的main方法(Android進程入口方法)
調用ActivityThread的attach
[4]thread.bindApplication 這是一個binder通信的過程
ActivityThread內部的Handler接收到BIND_APPLICATION消息
回到上面attachApplicationLocked的mAtmInternal.attachApplication,調用ATMS的attachApplication
看到了似曾相識的realStartActivityLocked,後面流程和之前一樣。Activity啟動流程分析完畢。
總結
1)與Activity管理有關的類:
ActivityRecord :歷史棧中的一個條目,代表一個Activity
TaskRecord :內部維護了一個ArrayList<ActivityRecord> ,來保存ActivityRecord
ActivityStack :內部維護了一個ArrayList<TaskRecord>,用來管理TaskRecord
ActivityStackSupervisor :用來管理ActivityStack的
2)Activity啟動流程
⑽ android 怎麼設置activity的啟動模式
在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 }
在android里,有4種activity的啟動模式,分別為:
「standard」 (默認)
「singleTop」
「singleTask」
「singleInstance」
1. 如何決定所屬task
「standard」和」singleTop」的activity的目標task,和收到的Intent的發送者在同一個task內,除非intent包括參數FLAG_ACTIVITY_NEW_TASK。
如果提供了FLAG_ACTIVITY_NEW_TASK參數,會啟動到別的task里。
2. 是否允許多個實例
「standard」和」singleTop」可以被實例化多次,並且存在於不同的task中,且一個task可以包括一個activity的多個實例;
「singleTask」和」singleInstance」則限制只生成一個實例,並且是task的根元素。
singleTop要求如果創建intent的時候棧頂已經有要創建 的Activity的實例,則將intent發送給該實例,而不發送給新的實例。
3. 是否允許其它activity存在於本task內
「singleInstance」獨佔一個task,其它activity不能存在那個task里;如果它啟動了一個新的activity,不管新的activity的launch mode 如何,新的activity都將會到別的task里運行(如同加了FLAG_ACTIVITY_NEW_TASK參數)。
而另外三種模式,則可以和其它activity共存。
4. 是否每次都生成新實例
「standard」對於沒一個啟動Intent都會生成一個activity的新實例;
「singleTop」的activity如果在task的棧頂的話,則不生成新的該activity的實例,直接使用棧頂的實例,否則,生成該activity的實例。
比如現在task棧元素為A-B-C-D(D在棧頂),這時候給D發一個啟動intent,如果D是 「standard」的,則生成D的一個新實例,棧變為A-B-C-D-D。
如果D是singleTop的話,則不會生產D的新實例,棧狀態仍為A-B-C-D
如果這時候給B發Intent的話,不管B的launchmode是」standard」 還是 「singleTop」 ,都會生成B的新實例,棧狀態變為A-B-C-D-B。
「singleInstance」是其所在棧的唯一activity,它會每次都被重用。
「singleTask」如果在棧頂,則接受intent,否則,該intent會被丟棄,但是該task仍會回到前台。
當已經存在的activity實例處理新的intent時候,會調用onNewIntent()方法
如果收到intent生成一個activity實例,那麼用戶可以通過back鍵回到上一個狀態;如果是已經存在的一個activity來處理這個intent的話,用戶不能通過按back鍵返回到這之前的狀態。
總結如下:
standard 每次都會新建,每個Task都可以有,且每個Task都可以有多個實例(每個Task都可以有,且可以有多個)
singleTop 當前實例如果在棧頂,就不新建實例,調用其OnNewIntent。 如不在棧頂,則新建實例 (每個Task都可以有,且可以有多個,在棧頂時可復用)
singleTask 新建一個Task,如果已經有其他的Task並且包含該實例,那就直接調用那個Task的實例。(只有一個Task中會有)
singleInstance 新建一個Task,且在該Task中只有它的唯一一個實例。 (只有一個Task會有,且該Task中只有它)
FLAG_ACTIVITY_NEW_TASK 類似singleTask
FLAG_ACTIVITY_SINGLE_TOP 類似singleTop
FLAG_ACTIVITY_CLEAR_TOP 無對應
啟動模式簡單地說就是Activity啟動時的策略,在AndroidManifest.xml中的標簽的android:launchMode屬性設置;
啟動模式有4種,分別為standard、singleTop、singleTask、singleInstance;
講解啟動模式之前,有必要先了解一下「任務棧」的概念;
一 :
standard 模式:這個就沒有什麼好說的了,Android默認Activity啟動的模式 就是 standard,如果有3個 Activity,Act1,Act2,Act3, 如果從Act1 啟動到Act2 ,在啟動到Act3,那麼Android 的任務棧(task stack)分別為 Act1、Act2、Act3,Act3 在棧頂,如果此時按手機返回鍵,則需要返回3次才能返回到桌面(假設是從桌面啟動的demo),任務棧分銷毀掉 Act3,Act2,最後Act1 。
二 :singleTop模式:
實驗效果:
singleTop模式:該啟動模式和standard模式相差不多,任務棧分配也很相似,如:現有 act1,act 2,在act2 清單文件中配置 android:launchMode="singleTop" ,其他都是默認standard 模式, 若從桌面啟動該實驗demo,從act 1,到act2 ,那麼任務棧則分配為,act1,act2,此時該任務棧和 standard 模式任務棧分配則完全相同,接下來則說明不同的地方,如果在act2 界面中 啟動 到act1, 此時的 任務棧 情況則為 act1,act2,act1,在由act1 啟動到act2,在啟動到act2,進行多次啟動,(在act2界面)任務棧的情況則為,act1,act2,act1,act2,棧頂的act2 則不會重新創建,則會復用act2 該 Activit, 依次類推。
理論知識:
singleTop,如果任務棧的棧頂元素是要被激活的組件,不會創建新的Activity放在任務棧,而是會復用棧頂的Activity。 如果發現棧頂的元素不是要激活的Activity,就會創建新的Activity 放置到任務棧裡面
singleTop模式應用場景 :
App程序中(或瀏覽器中)保存的書簽,假如用戶看到一個界面保存自己喜歡的標簽,假如要保存10個,這個時候用戶在返回鍵的時候,則會返回10次才能返回到App應用中, Android下singleTop 則解決該問題。
三singleTask 模式 :
實驗效果 相差不大,實驗內容就不多說了,自己可以寫個小demo,兩個Activity,每個Activiy 有兩個button,可以相互啟動 打日誌去動手查看,會理解更加深刻,可以參照著 SingleTop模式去實驗,以下只是講解下 和SingleTop的區別:
區別如下:(理論知識)
SingleTask 操作模式,一般和singleTop操作模式類似,如果他發現任務棧裡面已經有了要啟動的這個Activity,他會清空這個Activity所在的任務棧上面的所有Activiy,然後直接復用這個已經存在的Activity 。
應用場景:
如果一個App中,有一個功能需要載入網頁內容 ,打開一個 browserActiviy現在網頁內容,則內存開銷非常大,首先要初始化webkit /c++ 嵌入式瀏覽器內核broweractivity 配置了singleTask,空間換時間,使用該模式可以節省內存開銷。
四 :singleinstance 模式 :
直接理論知識吧」:
singleInstance操作模式會新開啟一個任務棧,跟其他普通Activity不是 同一個任務棧,比較牛,他的模式流程是 首先要新開啟一個新的任務棧把要激活的Activity放置到新的 任務棧里,這個任務棧裡面只有且 只有一個實例,也比較極端吧。說比較極端也跟他的應用場景有關系。
應用場景 :
App各種詞典,向有道詞典,什麼金山詞典,說極端是因為不想被放置到同一個任務棧裡面,它是全局的系統程序應用,達到節省內存的使用目的。
存有ghost版win7系統iso鏡像文件的u啟動uefi u盤啟動盤插在電腦u *** 介面上,然後重啟電腦,在出現開機畫面時用一鍵u盤啟動快捷鍵的方法進入到啟動項選擇窗口,然後將游標移至UEFI:開頭的項(注意:一定要選擇該項),按回車鍵執行等待進入到u啟動win pe系統,u啟動裝機工具會自動開啟,並載入到u啟動uefi u盤啟動盤中准備的win7系統安裝程序,點擊選擇c盤為系統安裝盤,再點擊「確定」按鈕繼續
隨即會彈出一個詢問是否執行該操作的提示窗口,點擊「確定」按鈕執行操作
然後耐心等待win7系統釋放完成並自動重啟電腦即可
電腦重啟後會完成系統後續程序安裝應用,直到進入win7系統桌面即可
樓主的這一段理論似乎有點不太准確 「在D完成操作以後,我啟動了系統內置的瀏覽器E,根據sdk的說法,瀏覽器E被放進了一個新任務。那麼現在有兩個任務」 你憑什麼確定瀏覽器E被放進了一個新的Task呢? 在啟動瀏覽器E的Intent里設置了flag? intentandroid開發 activity啟動模式中singleTop的疑問
Activity的四種啟動模式:standard:這是默認模式,每次激活Activity時都會創建Activity實例,並放入任務棧中。
singleTop: 如果在任務的棧頂正好存在該Activity的實例,就重用該實例( 會調用實例的 onNewIntent() ),否則就會創建新的實例並放入棧頂,即使棧中已經存在該Activity的實例,只要不在棧頂,都會創建新的實例。
singleTask:如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的 onNewIntent() )。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移出棧。如果棧中不存在該實例,將會創建新的實例放入棧中。
singleInstance:在一個新棧中創建該Activity的實例,並讓多個應用共享該棧中的該Activity實例。一旦該模式的Activity實例已經存在於某個棧中,任何應用再激活該Activity時都會重用該棧中的實例( 會調用實例的 onNewIntent() )。其效果相當於多個應用共享一個應用,不管誰激活該 Activity 都會進入同一個應用中。
位置在 AndroidManifest.xml 文件中 Activity 元素的 android:launchMode 屬性。
不知道你要問什麼,為你解答
Activity的四種啟動模式:standard:這是默認模式,每次激活Activity時都會創建Activity實例,並放入任務棧中。
singleTop: 如果在任務的棧頂正好存在該Activity的實例,就重用該實例( 會調用實例的 onNewIntent() ),否則就會創建新的實例並放入棧頂,即使棧中已經存在該Activity的實例,只要不在棧頂,都會創建新的實例。
singleTask:如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的 onNewIntent() )。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移出棧。如果棧中不存在該實例,將會創建新的實例放入棧中。
singleInstance:在一個新棧中創建該Activity的實例,並讓多個應用共享該棧中的該Activity實例。一旦該模式的Activity實例已經存在於某個棧中,任何應用再激活該Activity時都會重用該棧中的實例( 會調用實例的 onNewIntent() )。其效果相當於多個應用共享一個應用,不管誰激活該 Activity 都會進入同一個應用中。
位置在 AndroidManifest.xml 文件中 Activity 元素的 android:launchMode 屬性。