androidactivity棧
⑴ 由從服務中啟動activity——談談安卓的任務與棧
在安卓的服務中這樣啟動活動:
你會得到這樣的錯誤:
你知道我對安卓的什麼地方最為痴迷?是它應用之間的協作。怎麼協作?依靠activity之間的協作。
這種協作是可以跨越應用的。我們從task談起。
task最直觀的是安卓第三個虛擬鍵所列出的那些就是任務。
以上這種功能的實現,要從task談起,developer上,這樣定義task:
翻譯過來,大體意識就是task是一個具有棧結構的容器,用以執行一定特定的工作,它可以放置多個Activity實例。
啟動一個應用,系統就會為之創建一個task,來放置根Activity。默認情況下,一個Activity啟動另一個Activity時,兩個Activity是放置在同一個task中的,後者被壓入前者所在的task棧,當用戶按下後退鍵,後者從task被彈出,前者又顯示在幕前,特別是啟動其他應用中的Activity時,兩個Activity對用戶來說就好像是屬於同一個應用。
task可以分為系統task和task。這兩者之間是互相獨立的。
當我們運行一個應用時,按下Home鍵回到主屏,啟動另一個應用,這個過程中,之前的task被轉移到後台,新的task被轉移到前台,其根Activity也會顯示到幕前,過了一會之後,在此按下Home鍵回到主屏,再選擇之前的應用,之前的task會被轉移到前台,系統仍然保留著task內的所有Activity實例,而那個新的task會被轉移到後台,如果這時用戶再做後退等動作,就是針對該task內部進行操作了。
一個Activity當然要表面自己身在哪個task,所以每個Activity都有taskAffinity屬性。這個屬性指出了它希望進入的Task。
如果一個Activity指明自己的taskaffinity,那麼它的這個屬性就等於Application指明的taskAffinity,如果Application也沒有指明,那麼該taskAffinity的值就等於包名。
而Task也有自己的affinity屬性,它的值等於它的根Activity的taskAffinity的值。
顯示的聲明activiy的屬性
這很簡單,在AndroidManifest.xml中聲明
有了上面的基礎,請記住這兩種文檔說明的情況:
1. 如果該Activity的allowTaskReparenting設置為true,它進入後台,當一個和它有相同affinity的Task進入前台時,它會重新宿主,進入到該前台的task中。
**2. 如果載入某個Activity的intent,Flag被設置成FLAG_ACTIVITY_NEW_TASK時,它會首先檢查是否存在與自己taskAffinity相同的Task,如果存在,那麼它會直接宿主到該Task中,如果不存在則重新創建Task。 **
activity有四種啟動模式,分別為 standard,singleTop,singleTask,singleInstance。
這四種模式我不細說,我們只從名字上分析分析。
第一種,標准模式,想想就知道是平常的模式,這里的標准意思是每生成一個activity的實例,就當一個實例的放在棧里。
第二種,singleTop,在於那個top。要是activity不在棧頂,它和standard模式沒什麼區別,要是在top,就不創建一個新的,用棧頂原來那個。
第三種,不那麼容易,尤其是 官網的說法好像有問題。
singleTask模式的Activity只允許在系統中有一個實例。 如果系統中已經有了一個實例,持有這個實例的任務將移動到頂部,同時intent將被通過onNewIntent()發送。如果沒有,則會創建一個新的Activity並置放在合適的任務中。
這話的意思,我們分兩種情況討論,一是在同一個應用,二是不同。
在同一個應用中,如果系統中還沒有singleTask的Activity,會新創建一個,並放在同一任務的棧頂。但是如果已經存在,singleTask Activity上面的所有Activity將以合適的方式自動銷毀,讓我們想要顯示的Activity處於棧頂。
在非同一個應用中,intent是從另外的應用發送過來。系統中沒有任何Activity的實例的化,會創建一個新的任務,並且新的Activity被作為根Activity創建;如果系統中擁有這個singleTask的應用存在,新建的Activity會置於這個任務的上面。
第四種,和第三種很像,關鍵在於singleInstance,就是只能有這一個單例存在在棧中。
回到開頭,我們還沒解決開始的錯誤。最簡單粗暴的方法是:
這可以解決問題,不過也還存在一個小問題,留待讀者發現:)
Flag的字面意思很好理解,如果你讀懂了上述的任務與活動啟動模式的化,再提供幾個intent Flags:
至於意思,還是字面理解就好了。
⑵ Android基礎之Activity 運行模式與回退棧
LaunchMode 定義的是activity實例與task之間的關系,可以通過下面的兩種方式來定義:
在Activity A中啟動B,可以利用Activity B在清單中的launchmode定義,也可以在A中調用startActivity()的時候通過intent的flag傳入,當兩種方式都有定義,intent的flag參數會覆蓋掉B原有的定義。
利用Activity 元素的launchMode屬性
launchMode屬性指定Activity如何被運行到一個task中。launchMode的值有四種:
默認, 每次啟動Activity系統都會產生一個新的實例,並且把intent發送給新產生的實例,這個Activity可以被實例化多次,每個實例可以屬於不同的task,每個task也可以保有多個此Activity的實例。
如果當前task 的回退棧棧頂已經存在一個此Activity的實例,系統通過調用這個實例的onNewIntent()方法把intent發送給這個Activity實例,而不是創建一個新的此Activity的實例。這個Activity也可以被實例化多次,每個實例可以屬於不同的task,每個task可一個保有多個實例(僅限於此Activity已存在的實例不在棧頂)
注意:
應用場合如下:不想出現2個同樣的activity在頂部。比如用戶正在一個activity閱讀信息,這時來了notification,用戶點擊後應該更新這些信息,而不是新建一個activity,這樣在點擊back時,就不會出現回到舊信息activity的情況了。這種情況正是下面這段英語提到的。
Note: When a new instance of an activity is created, the user can press the Back button to return to the previous activity. But when an existing instance of an activity handles a new intent, the user cannot press the Back button to return to the state of the activity before the new intent arrived in onNewIntent()
.
例如,當前回退棧中有A,B,C,D四個Activity,全部是Standard,在D中調用startActivity()去啟動B,intent的flag設置成FLAG_ACTIVITY_CLEAR_TOP 和FLAG_ACTIVITY_NEW_TASK,系統發現棧中有B,會先銷毀這個B,再原位置重建B,清空CD,而不是把這個新建的B的實例壓入棧頂,這里之所以會銷毀B再新建B,因為B的launchmode是Standard,無論什麼情況下啟動,都需要new一個B的實例,但如果此時B是SingleTop的,系統會把這個intent通過onNewIntent傳給已經在棧中的B的實例,不需要銷毀再創建,仍需要清空CD。
系統會創建一個新的task並且把這個實例放在棧底( 此處有疑問,測試發現並不一定是棧底 ),但是,如果在一個單獨的task中已經存在一個此Activity的實例,系統會把intent通過onNewIntent()發送給這個實例( 測試發現如果在回退棧中,該Activity的上面還有其他Activity,啟動此Activity會清空棧中此Activity上面的其他Activity ),而不是創建一個新的實例。同一時間在只有一個此Activity的實例存在於系統中。
與SingleTask一樣,不同的是SingleTask的Activity所在的task中可以有其他的Activity,而SingleInstance的Activity獨佔一個task,並且在整個系統中只有唯一的一個實例。由這個Activity啟動的其他Activity都會在新的task中打開。
另一個例子,系統自帶瀏覽器APP把瀏覽器Activity聲明為SingleTask,通過在Activity標簽里的launchMode進行指定,這意味著如果你發送一個intent啟動瀏覽器,不管是為瀏覽器新開啟一個task還是從瀏覽器已經在後台保有的task中啟動瀏覽器,瀏覽器Activity與你的APP不在同一個task。
不管一個Activity是不是在一個新的task中啟動,點擊返回都會返回前一個Activity。不過,如果啟動一個LaunchMode為singleTask的Activity,如果該Activity此時在一個處於後台的task中,整個task會變成前台task,此時,回退棧會包含由這個後台task攜帶過來所有Activity,放在回退棧的棧頂,下圖說明這種情況。
在一個新的task里啟動Activity. 如果已經有Activity實例運行在某一task中,啟動這個Activity會把該實例所在的task帶到前台,由該實例的onNewIntent()來接收新的intent。
如果被啟動的Activity就是當前的Activity,這個已經存在的實例通過onNewIntent()接收intent,不會產生新的實例。
被啟動的Activity如果已經存運行於當前task,回退棧中所有在此Activity上面的Activity都將被銷毀,此Activity通過onNewIntent()接收新的intent。
例如,一個task中有A,B,C,D,四個Activity,如果D 調用startActivtiy()啟動Activity B,C和D會被銷毀,B接收這個intent,回退棧中有A,B。
上例中的Activity B的實例,或者通過onNewIntent()接收新的intent,或者銷毀新建來處理新的intent。如果B的launchmode是standard,並且沒有設置FLAG_ACTIVITY_SINGLE_TOP,那麼B會被銷毀重啟,如果是其他launchmode或者設置了FLAG_ACTIVITY_SINGLE_TOP,則會通過onNewIntent()接收。
FLAG_ACTIVITY_CLEAR_TOP 和FLAG_ACTIVITY_NEW_TASK結合使用會有個不錯的效果。
如果啟動的Activity位於task的底部,它會把所在task帶到前台,並且清理狀態至root狀態,當從通知欄里打開一個Activity的會非常有用。
Affinity指的是一個Activity偏向於從屬於哪個task,默認情況下,一個APP內的所有Activity互相之間共享一個affinity的值,所以,所有同一APP下的所有Activity都偏向於從屬於同一個task。但是,這個值是可以更改的,不同APP內的Activity可以共享一個affinity,同一個APP內的Activity也可以被分配不同的affinity的值。
affinity的值可以通過修改Activity標簽的taskAffinity屬性來修改。
這個屬性接收一個String的值,必須在manifest標簽范圍內是唯一的值,因為系統是通過名稱來標識APP的affinity的值的。
Affinity作用於以下兩種情況:
通過startActivity()啟動一個新的Activity時,默認情況下,新的Activity會被壓入與啟動者相同的回退棧中。但是,如果在啟動Activity的時候,使用了FLAG_ACTIVITY_NEW_TASK 這個標志,系統會為新的Activity尋找一個新的task。通常情況下,是一個新的task。但是也並不是必須的。如果系統中有一個task的affinity值與新的Activity的值相同,新的Activity會被分配到這個task中。如果沒有這樣的task,就啟動一個新的task。如果這個標志產生了一個新的task,當用戶點擊home鍵離開的時候,必須要有某種方式能夠使用戶返回到這個task來。有些實體(例如通知管理器)總是從一個外部task中啟動Activity,所以在通過startActivity()啟動新的Activity時總是需要傳遞FLAG_ACTIVITY_NEW_TASK 這個標志。如果你有一個Activity可以被外部實體可能這個標志啟動,注意用戶可以有一種獨立的方式回到啟動它的task,例如點擊啟動圖標。
這種情況下,一個Activity可以動啟動它的那個task移動到它的affinity值對應的task中,當那個task回到前台。例如,假設,一個報告指定城市天氣情況的Activity作為一個旅行APP的一部分,它跟其他處在同一APP的Activity一樣有一個相同的affinity值,並且允許通過這個屬性來調整目標task。當你的一個Activity啟動了這個天氣預報Activity,它默認跟你的Activity在一個task里,但是,當旅行APP進入到前台,這個天氣預報Activity又會被重新分配給旅行APP並且在旅行APP內展示。
提示:
如果一個APK文件從用戶的角度看是多款APP,可能需要這個屬性來設置不同的affinity來關聯不同的APP。
如果用戶離開一個task太長時間,系統會清除task中的所有Activity僅僅保留這下根Activity。當用戶返回到這個task的時候,只有這個根Activity會被恢復。系統通過這種方式來處理,是因為經過相當長的一段時間之後,用戶已經拋棄他們曾經正在做的事情,計劃再回來的時候做點新的事情。
你可以通過如下屬性來更改這種行為:
參考文獻:
Tasks and Back Stack
<activity>
Android 閱讀Tasks and Back Stack文章後的重點摘抄
⑶ android怎樣將activity放入全局棧
Activity是Android程序的表現層。程序的每一個顯示屏幕就是一個Activity。正在運行的Activity處在棧的最頂端,它是運行狀態的。
當有新的Activity進入屏幕最上端時,原來的Activity就會被壓入第二層。如果他的屏幕沒有被完 全遮蓋,那麼他處於Paused狀態,如果他被遮蓋那麼處於Stop狀態。
不管處於任何一層,都可能在系統覺得資源不足時被強行關閉,當然關閉時棧底的程序最先被關閉。
譬如:當你在程序中調用 Activity.finish()方法時,結果和用戶按下 BACK 鍵一樣:他告訴 Activity Manager該Activity實例可以被「回收」。隨後 Activity Manager 激活處於棧第二層的 Activity 並重 新入棧,把原 Activity 壓入到棧的第二層,從 Running 狀態轉到 Paused 狀態。
在BlackBerry中,提供了一個管理Screen的棧,用來從任何地方來關閉位於最上一層的Screen,使用UiApplication.getUiApplication().getActiveScreen()來得到位於最上一層的Screen的實例,並且使用UiApplication.getUiApplication().popScreen()來關閉一個Screen或關閉當前最上一層的Screen,但是Android卻未提供相應的功能,只能在一個Activity的對象裡面調用finish來關閉自己,不能關閉其他的Activity。比如我們想實現一個功能從屏幕A—>屏幕B—>屏幕C—>屏幕D,然後在在轉到屏幕D之前將屏幕B和C關閉,在屏幕B和屏幕C界面點擊會退按鈕都可以回退到上一個屏幕,但是在屏幕D上點擊會退按鈕讓其回退到A,此外在一些循環跳轉的界面上如果不在合適的地方將一些不需要的屏幕關閉,那麼經過多次跳轉後回導致內存溢出。對此我們可以設計一個全局的Activity棧,使用這個棧來管理Activity。管理Activity的類的定義如下:
import java.util.Stack;
import android.app.Activity;
public class ScreenManager {
private static Stack activityStack;
private static ScreenManager instance;
private ScreenManager(){
}
public static ScreenManager getScreenManager(){
if(instance==null){
⑷ android 中怎樣能夠清除activity堆棧,也就是退出整個應用
如果退出整個程序,如下操作:方式一:Intent intent=new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);this.startActivity(intent);System.exit(0); 方式二:android.os.Process.killProcess(android.os.Process.myPid()); android 完全退出程序有幾個activity,有一需求是在一個activityA點擊back鍵退出系統而不是跳到之前的activity首先想到的是清空activityA的堆棧,使用intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 但是該activityA不是已經存在於堆棧底端的,所以清除的只是堆棧中該activityA上面的activity,但後退後還是會返回堆棧中該activityA下面的activity。
⑸ android a應用的activity啟動b應用的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中的Activity詳解--啟動模式與任務棧
目錄
activity的簡單介紹就不寫了,作為最常用的四大組件之一,肯定都很熟悉其基本用法了。
首先,是都很熟悉的一張圖,即官方介紹的Activity生命周期圖.
情景:打開某個應用的的FirstActivity調用方法如下:
由於之前已經很熟悉了,這里就簡單貼一些圖。
按下返回鍵:
重新打開並按下home鍵:
再重新打開:
在其中打開一個DialogActivity(SecondActivity)
按下返回:
修改SecondAcitvity為普通Activity,依舊是上述操作:
這里強調一下 onSaveInstanceState(Bundle outState) 方法的調用時機:
當Activity有可能被系統殺掉時調用,注意,一定是被系統殺掉,自己調用finish是不行的。
測試如下:FirstActivity啟動SecondActivity:
一個App會包含很多個Activity,多個Activity之間通過intent進行跳轉,那麼原始的Activity就是使用棧這個數據結構來保存的。
Task
A task is a collection of activities that users interact with when performing a certain job. The activities are arranged in a stack (the back stack ), in the order in which each activity is opened.
即若干個Activity的集合的棧表示一個Task。
當App啟動時如果不存在當前App的任務棧就會自動創建一個,默認情況下一個App中的所有Activity都是放在一個Task中的,但是如果指定了特殊的啟動模式,那麼就會出現同一個App的Activity出現在不同的任務棧中的情況,即會有任務棧中包含來自於不同App的Activity。
標准模式,在不指定啟動模式的情況下都是以此種方式啟動的。每次啟動都會創建一個新的Activity實例,覆蓋在原有的Activity上,原有的Activity入棧。
測試如下:在FirstActivity中啟動FirstActivity:
當只有一個FirstActivity時堆棧情況:
此種模式下,Activity在啟動時會進行判斷,如果當前的App的棧頂的Activity即正在活動的Activity就是將要啟動的Activity,那麼就不會創建新的實例,直接使用棧頂的實例。
測試,設置FirstActivity為此啟動模式,多次點擊FirstActivity中的啟動FirstActivity的按鈕查看堆棧情況:
(其實點擊按鈕沒有啟動新Activity的動畫就可以看出並沒有啟動新Activity)
大意就是:
對於使用singleTop啟動或Intent.FLAG_ACTIVITY_SINGLE_TOP啟動的Activity,當該Activity被重復啟動(注意一定是re-launched,第一次啟動時不會調用)時就會調用此方法。
且調用此方法之前會先暫停Activity也就是先調用onPause方法。
而且,即使是在新的調用產生後此方法被調用,但是通過getIntent方法獲取到的依舊是以前的Intent,可以通過setIntent方法設置新的Intent。
方法參數就是新傳遞的Intent.
1.如果是同一個App中啟動某個設置了此模式的Activity的話,如果棧中已經存在該Activity的實例,那麼就會將該Activity上面的Activity清空,並將此實例放在棧頂。
測試:SecondActivity啟動模式設為singleTask,啟動三個Activity:
這個模式就很好記,以此模式啟動的Activity會存放在一個單獨的任務棧中,且只會有一個實例。
測試:SecondActivity啟動模式設為singleInstance
結果:
顯然,啟動了兩次ThirdActivity任務棧中就有兩個實例,而SecondActivity在另外一個任務棧中,且只有一個。
在使用Intent啟動一個Activity時可以設置啟動該Activity的啟動模式:
這個屬性有很多,大致列出幾個:
每個啟動的Activity都在一個新的任務棧中
singleTop
singleTask
用此種方式啟動的Activity,在它啟動了其他Activity後,會自動finish.
官方文檔介紹如下:
這樣看來的話,通俗易懂的講,就是給每一個任務棧起個名,給每個Activity也起個名,在Activity以singleTask模式啟動時,就檢查有沒有跟此Activity的名相同的任務棧,有的話就將其加入其中。沒有的話就按照這個Activity的名創建一個任務棧。
測試:在App1中設置SecondActivity的taskAffinity為「gsq.test」,App2中的ActivityX的taskAffinity也設為「gsq.test」
任務棧信息如下:
結果很顯然了。
測試:在上述基礎上,在ActivityX中進行跳轉到ActivityY,ActivityY不指定啟動模式和taskAffinity。結果如下:
這樣就沒問題了,ActivityY在一個新的任務棧中,名稱為包名。
這時從ActivityY跳轉到SecondActivity,那應該是gsq.test任務棧只有SecondActivity,ActivityX已經沒有了。因為其啟動模式是singleTask,在啟動它時發現已經有一個實例存在,就把它所在的任務棧上面的Activity都清空了並將其置於棧頂。
還有一點需要提一下,在上面,FirstActivity是App1的lunch Activity,但是由於SecondActivity並沒有指定MAIN和LAUNCHER過濾器,故在FirstActivity跳轉到SecondActivity時,按下home鍵,再點開App1,回到的是FirstActivity。
大致就先寫這么多吧,好像有點長,廢話有點多,估計也有錯別字,不要太在意~~~
⑺ android面試一個應用的兩個activity 可以在不同棧里嗎
1、什麼是Activity
通俗一點說Activity就是一個界面,這個界面裡面可以放置各個控制項。Activity的界面也是用xml表示,放置在res->layout下面。每生成一個新的Activity後,我們需要在AndroidManifest.xml中注冊一下這個Activity。
2、請描述一下Activity的生命周期
onCreate(Bundle savedInstanceState):創建Activity時調用,設置在該方法中,還以Bundle的形式提供對以前存儲的任何狀態的訪問。
onStart():activity變為在屏幕上對用戶可見時調用
onResume():activity開始與用戶交互時調用(無論是啟動還是重新啟動一個activity,該方法總是被調用)
onPause():activity被暫停或者收回cpu和其他資源時調用,該方法用於保存活動狀態的,也是保護現場,壓棧吧
onStop():activity被停止並轉為不可見階段及後續的生命周期事件時調用。
onRestart():重新啟動activity時調用,該活動仍在棧中,而不是啟動新的activity
onDestroy():activity被完全從系統內存中移除時調用
3、兩個Activity之間跳轉時必然會執行的是哪幾個方法:
onCreate():在activity生命周期開始時調用
onRestoreInstanceState():用來恢復UI狀態
onRestart():當activity重新啟動時調用
onStart():當activity對用戶即將可見時調用
onResume():當activity與用戶交互時,繪制界面
onSaveInstanceState():當activity即將移除棧頂保留UI狀態時被調用
onPause():暫停當前活動的activity,提交持久數據的改變,停止動畫和其他佔用CPu資源的東西,由於下一個activity在這個方法返回之前不會resume,所以這個方法的代碼執行要快
onStop():activity不再可見時調用
onDestroy():在activity銷毀棧時被調用的最後一個方法
4、橫豎屏幕切換時候activity的生命周期
①不設置activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,且豎屏時會執行兩次
②設置activity的android:configChanges=」orientation"時,切屏還是會調用各個生命周期,切橫屏,豎屏時只會執行一次
③設置activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法
5、你後台的Activity被系統回收怎麼辦?
系統會幫我們記錄下回收之前Activity的狀態,再次調用被回收的Activity就要重新調用onCreate()方法,不同於直接啟動的是這回onCreate()裡面帶上參數savedInstanceState,savedInstanceState是一個Bundle對象,基本上可以把它理解為系統幫你維護的一個map對象,使用它可以恢復到回收前的狀態
6、如何將一個activity設置為窗口的樣式
①在你的style.xml文件中可以新建一如下的類似Dialog的style:
<style name="Theme.FloatActivity" parent="android:style/Theme.Dialog></style>
②在AndroidManifest.xml中在你需要顯示為窗口的activity中添加如下屬性:
android:theme="@style/Theme.FloatActivity"即可
也可以直接添加對應需要展示為Dialog style的activity的android:theme屬性值為:android:theme="@android:style/Theme.Dialog"
7、兩個activity之間怎樣傳遞數據
在Intent的對象中增加要傳遞的參數即可
在Intent對象的請求中加入鍵值對,對應名字.putExtra(「鍵值對的名字","鍵值對的值");在另一個activity中將Intent的請求中的數據取出來:
Intent intent= getIntent();String value = intent.getStringExtra("testIntent")
8、在同一個程序,但不同的activity中是否可以放在不同的Task任務棧中?
可以放在不同的Task中。需要為不同的activity設置不同的taskaffinity屬性,啟動activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK標記