版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第二章Android生命周期與組件通信1主要內(nèi)容2.1Android生命周期2.2Activity組件2.3Intent信使22.1Android生命周期程序的生命周期程序的生命周期是在Android系統(tǒng)中進程從啟動到終止的所有階段,也就是Android程序啟動到停止的全過程。程序的生命周期由Android系統(tǒng)進行調(diào)度和控制的。Android系統(tǒng)中的進程優(yōu)先級由高到低前臺進程可見進程服務(wù)進程后臺進程空進程3前臺進程前臺進程是Android系統(tǒng)中最重要的進程,是與用戶正在交互的進程,包含以下四種情況。進程中的Activity正在與用戶進行交互。進程服務(wù)被Activity調(diào)用,而且這個Activity正在與用戶進行交互。進程服務(wù)正在執(zhí)行聲明周期中的回調(diào)函數(shù),如onCreate()、onStart()或onDestroy()。進程的BroadcastReceiver正在執(zhí)行onReceive()函數(shù)。Android系統(tǒng)在多個前臺進程同時運行時,可能會出現(xiàn)資源不足的情況,此時會清除部分前臺進程,保證主要的用戶界面能夠及時響應(yīng)。2.1Android生命周期4可見進程可見進程指部分程序界面能夠被用戶看見,卻不在前臺與用戶交互,不響應(yīng)界面事件的進程。如果一個進程包含服務(wù),且這個服務(wù)正在被用戶可見的Activity調(diào)用,此進程同樣被視為可見進程。Android系統(tǒng)一般存在少量的可見進程,只有在特殊的情況下,Android系統(tǒng)才會為保證前臺進程的資源而清除可見進程。2.1Android生命周期5服務(wù)進程服務(wù)進程是指包含已啟動服務(wù)的進程沒有用戶界面在后臺長期運行Android系統(tǒng)除非不能保證前臺進程或可視進程所必要的資源,否則不強行清除服務(wù)進程后臺進程后臺進程是指不包含任何已經(jīng)啟動的服務(wù),而且沒有任何用戶可見的Activity的進程Android系統(tǒng)中一般存在數(shù)量較多的后臺進程,在系統(tǒng)資源緊張時,系統(tǒng)將優(yōu)先清除用戶較長時間沒有見到的后臺進程2.1Android生命周期6空進程空進程是不包含任何活躍組件的進程空進程在系統(tǒng)資源緊張時會被首先清除但為了提高Android系統(tǒng)應(yīng)用程序的啟動速度,Android系統(tǒng)會將空進程保存在系統(tǒng)內(nèi)存用,在用戶重新啟動該程序時,空進程會被重新使用除了以上的優(yōu)先級外,以下兩方面也決定他們的優(yōu)先級進程的優(yōu)先級取決于所有組件中的優(yōu)先級最高的部分進程的優(yōu)先級會根據(jù)與其他進程的依賴關(guān)系而變化2.1Android生命周期72.2Activity組件
2.2.1Android組件簡介2.2.2Activity生命周期2.2.3Task與Activity棧2.2.4Activity基本狀態(tài)82.2.1Android組件簡介組件是可以調(diào)用的基本功能模塊,Android應(yīng)用程序就是由組件組成的。Android系統(tǒng)有四個重要的組件,分別是Activity、Service、BroadcastReceiver和ContentProvider。ActivityActivity是Android程序的呈現(xiàn)層,顯示可視化的用戶界面,并接收與用戶交互所產(chǎn)生的界面事件。Android應(yīng)用程序可以包含一個或多個Activity,一般在程序啟動后會呈現(xiàn)一個Activity,用于提示用戶程序已經(jīng)正常啟動。在界面上的表現(xiàn)形式:全屏窗體,非全屏懸浮窗體,對話框。ServiceService用于沒有用戶界面,但需要長時間在后臺運行的應(yīng)用。92.2.1Android組件簡介BroadcastReceiverBroadcastReceiver是用來接受并響應(yīng)廣播消息的組件。不包含任何用戶界面。可以通過啟動Activity或者Notification通知用戶接收到重要信息。Notification能夠通過多種方法提示用戶,包括閃動背景燈、震動設(shè)備、發(fā)出聲音或在狀態(tài)欄上放置一個持久的圖標(biāo)。ContentProviderContentProvider是Android系統(tǒng)提供的一種標(biāo)準(zhǔn)的共享數(shù)據(jù)的機制,應(yīng)用程序可以通過ContentProvider訪問其他應(yīng)用程序的私有數(shù)據(jù)。私有數(shù)據(jù)可以是存儲在文件系統(tǒng)中的文件,也可以是SQLite中的數(shù)據(jù)庫。Android系統(tǒng)內(nèi)部也提供一些內(nèi)置的ContentProvider,能夠為應(yīng)用程序提供重要的數(shù)據(jù)信息。102.2.2Activity生命周期Activity生命周期Activity生命周期指Activity從啟動到銷毀的過程。Activity表現(xiàn)為四種狀態(tài),分別是活動狀態(tài)、暫停狀態(tài)、停止?fàn)顟B(tài)和非活動狀態(tài)?;顒訝顟B(tài),Activity在用戶界面中處于最上層,完全能用戶看到,能夠與用戶進行交互。暫停狀態(tài),Activity在界面上被部分遮擋,該Activity不再處于用戶界面的最上層,且不能夠與用戶進行交互。停止?fàn)顟B(tài),Activity在界面上完全不能被用戶看到,也就是說這個Activity被其他Activity全部遮擋。非活動狀態(tài)不在以上三種狀態(tài)中的Activity則處于非活動狀態(tài)。112.2.2Activity生命周期Activity的四種狀態(tài)的變換關(guān)系圖12舉例:建立一個新的Android工程工程名稱:Chp02_NewActivity包名稱:com.NewActivityActivity名稱:NewActivity132.2.2
Activity生命周期NewActivity.java文件的代碼1packagecom.NewActivity;23importandroid.app.Activity;4importandroid.os.Bundle;5importandroid.widget.Button;6importandroid.widget.TextView;78publicclassNewActivityextendsActivity{9 privateTextViewm_txtNewAct=null;10 privateButtonm_btnNewAct=null;11/**Calledwhentheactivityisfirstcreated.*/12@Override13publicvoidonCreate(BundlesavedInstanceState){14super.onCreate(savedInstanceState);15setContentView(R.layout.main);16this.m_btnNewAct=(Button)findViewById(R.id.btnNewAct);17this.m_txtNewAct=(TextView)findViewById(R.id.txtNewAct);18this.m_txtNewAct.setText("文本控件");19this.m_btnNewAct.setText("按鈕控件");142.2.2
Activity生命周期NewActivity.java文件的代碼從代碼第8行可以看出,一個Activity就是一個Java類,而且必須繼承自Activity基類。代碼第13行復(fù)寫了基類的onCreate()方法,并且在14行調(diào)用了父類的onCreate()方法,這在創(chuàng)建Activity時同樣是必須的,在Activity第一次運行時總會首先執(zhí)行onCreate()方法,此方法作用類似于其它面向?qū)ο笳Z言中的構(gòu)造函數(shù)。代碼15行采用setContentView()方法設(shè)置布局文件,代碼16和17行的findViewById()方法功能是通過控件ID屬性獲得所需的控件對象,此方法返回View類,View類是android系統(tǒng)的控件基類,可以通過強制類型轉(zhuǎn)換轉(zhuǎn)化成所需的控件對象。代碼18行和19行完成相應(yīng)控件顯示文本的設(shè)置。20.}21.}15AndroidManifest.xml文件中聲明Activity的代碼如下:2.2.2
Activity生命周期……1<applicationandroid:icon="@drawable/icon"android:label="@string/app_name">2<activityandroid:name=".NewActivity"3android:label="@string/app_name">4<intent-filter>5<actionandroid:name="ent.action.MAIN"/>6<categoryandroid:name="ent.category.LAUNCHER"/>7</intent-filter>8</activity>9</application>……162.2.2
Activity生命周期在應(yīng)用程序application元素中聲明了前面所定義的Activity,在application元素中同樣可以聲明Service、BroadcastReceiver和ContentProvider。代碼第2行屬性android:name定義了實現(xiàn)Activity類的名稱,其值有兩種實現(xiàn)形式,一種是使用全稱com.NewActivity,另外一種是使用簡化后的類名稱.NewActivity,其中的“.”不可省略。第3行屬性android:label定義了Activity的標(biāo)簽名稱,此名稱將在Activity界面上面以標(biāo)題形式顯示,@string/app_name是一種資源引用方式,其真實值是res/values/string.xml文件中app_name元素代表的字符串值。intent-filter元素中包含了兩個子元素action和category,這些元素的意義將在后面詳細(xì)介紹,在這里intent-filter的功能就是設(shè)置程序的啟動主窗體為包含它的Activity。172.2.2
Activity生命周期在創(chuàng)建的Activity上可以按照需要布局必要的界面控件,如上面的Activity上添加了一個按鈕(Button)和一個文本框(TextView),其聲明的代碼如下所示:……1<TextView2android:layout_width="fill_parent"3android:layout_height="wrap_content"4android:id="@+id/txtNewAct"5/>6<Button7android:layout_width="fill_parent"8android:layout_height="wrap_content"9android:id="@+id/btnNewAct"10/>……182.2.2
Activity生命周期屬性android:layout_width定義控件橫向?qū)挾?,屬性android:layout_height定義控件縱向高度,屬性android:layout_width和屬性android:layout_height的可選值均為fill_parent與wrap_content。fill_parent值代表填充父控件,wrap_content值代表按照內(nèi)容填充。屬性android:id定義控件唯一標(biāo)識名稱,“@+id”告訴系統(tǒng)在R.java文件中生成相應(yīng)的值。在生命周期中起重要作用的是它的事件回調(diào)函數(shù)。Activity提供了七個生命周期的事件回調(diào)函數(shù),在這些事件回調(diào)函數(shù)中添加相應(yīng)的功能代碼可以實現(xiàn)或者完成相應(yīng)的功能。192.2.2Activity生命周期事件的回調(diào)函數(shù)publicclassMyActivityextendsActivity{protectedvoidonCreate(BundlesavedInstanceState);protectedvoidonStart();protectedvoidonRestart();protectedvoidonResume();protectedvoidonPause();protectedvoidonStop();protectedvoidonDestroy();}202.2.2Activity生命周期Activity生命周期的事件回調(diào)函數(shù)函數(shù)是否
可終止說明onCreate()否Activity啟動后第一個被調(diào)用的函數(shù),常用來進行Activity的初始化,例如創(chuàng)建View、綁定數(shù)據(jù)或恢復(fù)信息等。onStart()否當(dāng)Activity顯示在屏幕上時,該函數(shù)被調(diào)用。onRestart()否當(dāng)Activity從停止?fàn)顟B(tài)進入活動狀態(tài)前,調(diào)用該函數(shù)。onResume()否當(dāng)Activity能夠與用戶交互,接受用戶輸入時,該函數(shù)被調(diào)用。此時的Activity位于Activity棧的棧頂。onPause()是當(dāng)Activity進入暫停狀態(tài)時,該函數(shù)被調(diào)用。一般用來保存持久的數(shù)據(jù)或釋放占用的資源。onStop()是當(dāng)Activity進入停止?fàn)顟B(tài)時,該函數(shù)被調(diào)用。onDestroy()是在Activity被終止前,即進入非活動狀態(tài)前,該函數(shù)被調(diào)用。212.2.2Activity生命周期Activity狀態(tài)保存/恢復(fù)的事件回調(diào)函數(shù)函數(shù)是否
可終止說明onSaveInstanceState()否Android系統(tǒng)因資源不足終止Activity前調(diào)用該函數(shù),用以保存Activity的狀態(tài)信息,供onRestoreInstanceState()或onCreate()恢復(fù)之用。onRestoreInstanceState()否恢復(fù)onSaveInstanceState()保存的Activity狀態(tài)信息,在onStart()和onResume()之間被調(diào)用。22Activity事件回調(diào)函數(shù)的調(diào)用順序232.2.2
Activity生命周期全生命周期函數(shù)的調(diào)用順序:onCreate()→onStart()→onResume()→onPause()→onStop()→onDestroy()調(diào)用onCreate()函數(shù)分配資源調(diào)用onStart()將Activity顯示在屏幕上調(diào)用onResume()獲取屏幕焦點調(diào)用onPause()、onStop()和onDestroy(),釋放資源并銷毀進程242.2.2
Activity生命周期全生命周期運行程序,啟動MainActivity完成后,查看日志過濾器中的System.out信息如圖2.2.2(a)。如果此時再按下模擬器的返回鍵,則相當(dāng)于關(guān)閉了MainActivity,日志過濾器中的System.out信息變成了如圖2.2.2(b)。圖2.2.2(a)MainActivity啟動日志圖2.2.2(b)MainActivity全生命周期日志252.2.2
Activity生命周期可視生命周期可視生存期(VisibleLifetime)是指從調(diào)用onStart()開始到調(diào)用onStop()結(jié)束之間的周期階段。在這段時間里,Activity對用戶是可見的,但是它有可能不是用戶所關(guān)注的Activity,或者它可能被部分遮擋了。當(dāng)Activity界面不可見的時候更新它是沒有意義的,因為這樣子消耗了資源卻沒有起到實際的作用。當(dāng)Activity界面再次可見的時候,可以使用onStart()或者onRestart()來恢復(fù)或者重啟這些進程。onRestart()方法在onStart()方法前被調(diào)用,用于Activity從不可見變?yōu)榭梢姷倪^程,進行特定處理。Activity經(jīng)常在可見和不可見的狀態(tài)多次轉(zhuǎn)換,所以onStart()和onStop()多次被調(diào)用。另外,onStart()和onStop()同樣也用于注冊和銷毀BroadcastReceive。262.2.2
Activity生命周期可視生命周期函數(shù)的調(diào)用順序:
onSaveInstanceState()→onPause()→onStop()→onRestart()→onStart()→onResume()調(diào)用onSaveInstanceState()函數(shù)保存Activity狀態(tài)調(diào)用onPause()和onStop(),停止對不可見Activity的更新調(diào)用onRestart()恢復(fù)需要界面上需要更新的信息調(diào)用onStart()和onResume()重新顯示Activity,并接受用戶交互272.2.2
Activity生命周期活動生命周期活動生存期(ForegroundLifetime)指調(diào)用onResume()及其對應(yīng)的onPause()之間的那段生存期,此時,Activity在屏幕的最上層,能夠與用戶直接交互。在活動生存期內(nèi)可以安全的假設(shè)onSaveInstanceState()和onPause()會被調(diào)用,大部分Activity至少需重寫onPause()方法來提交未保存的改動,因為在onPause()之外Activity可能在沒有任何警告的情況下被終止。在Activity不在前臺的時候也可以根據(jù)應(yīng)用程序的架構(gòu),選擇掛起線程、進程或者廣播接收器。onResume()方法可以是輕量級的,因為要求加載Activity界面的時候可以由onCreate()和onRestoreIntanceState()方法處理。使用onResume()可以重新注冊已經(jīng)使用onPause()停止的廣播接收器或者其他進程。onPause()最好也是輕量級的,因為下一個要顯示到前臺的activity的onRsume()要等當(dāng)前activity的onPause返回后才執(zhí)行。所以,盡量讓onPause()方法中的代碼執(zhí)行迅速,讓onResume()方法中的代碼盡可能少,以保證在前臺和后臺之間進行切換的時候程序能夠保持響應(yīng)。282.2.2
Activity生命周期活動生命周期函數(shù)調(diào)用順序如下:onSaveInstanceState()→onPause()→onResume()調(diào)用onSaveInstanceState()保存Activity的狀態(tài)調(diào)用onPause()停止與用戶交互調(diào)用onResume()恢復(fù)與用戶的交互29舉例:建立一個新的Android工程工程名稱:Chp02_ActivityLife包名稱:com.NewActivityActivity名稱:NewActivity302.2.2
Activity生命周期MainActivity.java文件的代碼……1//主窗體2publicclassMainActivityextendsActivity{3 privateButtonm_btnMainAct=null;4 privateTextViewm_txtMainAct=null;5/**Calledwhentheactivityisfirstcreated.*/6@Override7publicvoidonCreate(BundlesavedInstanceState){8System.out.println("MainActivity-onCreate");9 super.onCreate(savedInstanceState);10setContentView(R.layout.main);11m_btnMainAct=(Button)findViewById(R.id.btnMainAct);12m_txtMainAct=(TextView)findViewById(R.id.txtMainAct);13m_btnMainAct.setOnClickListener(newButtonListener());14m_btnMainAct.setText("啟動SecondActivity");15m_txtMainAct.setText("這是MainActivity");16}17 @Override18 protectedvoidonDestroy(){19 //TODOAuto-generatedmethodstub312.2.2
Activity生命周期MainActivity.java文件的代碼20 System.out.println("MainActivity-onDestroy");21 super.onDestroy();22 }23 @Override24 protectedvoidonPause(){25 //TODOAuto-generatedmethodstub26 System.out.println("MainActivity-onPause");27 super.onPause();28 }29 @Override30 protectedvoidonRestart(){31 //TODOAuto-generatedmethodstub32 System.out.println("MainActivity-onRestart");33 super.onRestart();34 }35 @Override36 protectedvoidonResume(){37 //TODOAuto-generatedmethodstub322.2.2
Activity生命周期MainActivity.java文件的代碼38 System.out.println("MainActivity-onResume");39 super.onResume();40 }41 @Override42 protectedvoidonStart(){43 //TODOAuto-generatedmethodstub44 System.out.println("MainActivity-onStart");45 super.onStart();46 }47 @Override48 protectedvoidonStop(){49 //TODOAuto-generatedmethodstub50 System.out.println("MainActivity-onStop");51 super.onStop();52 }332.2.2
Activity生命周期NewActivity.java文件的代碼
MainActivity是主窗體類,此類中重寫了Activity的七個生命周期回調(diào)函數(shù),并均使用方法System.out.println(),此方法向控制臺輸出相應(yīng)信息并換行。代碼53行通過內(nèi)部類實現(xiàn)按鈕點擊監(jiān)聽器。代碼56-58行,通過Intent實現(xiàn)不同Activity的交互,Intent會在后面的內(nèi)容中詳細(xì)介紹。ButtonListener類實現(xiàn)的功能是按鈕點擊后的響應(yīng),即啟動另一個Activity。53 classButtonListenerimplementsOnClickListener{54 @Override55 publicvoidonClick(Viewv){ 56 Intentintent=newIntent(); 57 intent.setClass(MainActivity.this,SecondActivity.class); 58 MainActivity.this.startActivity(intent);59 }60 }61}342.2.2
Activity生命周期SecondActivity.java代碼文件1//第二屏2publicclassSecondActivityextendsActivity{3 privateButtonm_btnSecondAct=null;4 privateTextViewm_txtSecondAct=null;5 /**Calledwhentheactivityisfirstcreated.*/6@Override7publicvoidonCreate(BundlesavedInstanceState){8 System.out.println("SecondActivity-onCreate");9super.onCreate(savedInstanceState);10setContentView(R.layout.second);11m_btnSecondAct=(Button)findViewById(R.id.btnSecondAct);12m_txtSecondAct=(TextView)findViewById(R.id.txtSecondAct);13m_btnSecondAct.setOnClickListener(newButtonListener());14m_btnSecondAct.setText("返回MianActivity");15m_txtSecondAct.setText("這是SecondActivity");16}17 @Override18 protectedvoidonDestroy(){19 //TODOAuto-generatedmethodstub352.2.2
Activity生命周期SecondActivity.java文件的代碼20 System.out.println("SecondActivity-onDestroy");21 super.onDestroy();22 }23 @Override24 protectedvoidonPause(){25 //TODOAuto-generatedmethodstub26 System.out.println("SecondActivity-onPause");27 super.onPause();28 }29 @Override30protectedvoidonRestart(){31 //TODOAuto-generatedmethodstub32 System.out.println("SecondActivity-onRestart");33 super.onRestart();34 }35 @Override36 protectedvoidonResume(){37 //TODOAuto-generatedmethodstub362.2.2
Activity生命周期MainActivity.java文件的代碼38 System.out.println("SecondActivity-onResume");39 super.onResume();40 }41 @Override42protectedvoidonStart(){43 //TODOAuto-generatedmethodstub44 System.out.println("SecondActivity-onStart");45 super.onStart();46 }47 @Override48 protectedvoidonStop(){49 //TODOAuto-generatedmethodstub50 System.out.println("SecondActivity-onStop");51 super.onStop();52 }372.2.2
Activity生命周期NewActivity.java文件的代碼
通過查看日志信息可以跟蹤上面代碼的運行情況。在Eclipse中切換到DDMS界面,其中的LogCat用于顯示系統(tǒng)日志信息,能夠捕獲的信息包括Dalvik虛擬機產(chǎn)生的信息、進程信息、ActivityManager信息、PackagerManager信息、Homeloader信息、WindowsManager信息、Android運行時信息和應(yīng)用程序信息等。通過在LogCat中添加日志過濾器可以跟蹤查看System.out輸出信息。53 classButtonListenerimplementsOnClickListener{54 @Override55 publicvoidonClick(Viewv){ 56 Intentintent=newIntent(); 57 intent.setClass(SecondActivity.this,MainActivity.class); 58 SecondActivity.this.startActivity(intent);59 }60}61}382.2.2
Activity生命周期MainActivity調(diào)用SecondActivity日志重新運行上面的工程,MainActivity啟動完成后,System.out信息同圖2.2.2(a),此時點擊上面的按鈕啟動SecondActivity,查看System.out信息,如圖2.2.3所示。從圖中可以看出,前三行信息是MainActivity的啟動日志,后面五行是MainActivity中啟動SecondActivity的日志。SecondActivity的啟動過程中,首先調(diào)用MainActivity的onPause()方法,再依次調(diào)用SecondActivity的onCreate()、onStart()和onResume(),最后調(diào)用MainActivity的onStop()方法,此時SecondActivity完全遮蓋MainActivity。392.2.2
Activity生命周期從SecondActivity返回到MainActivity日志此過程中首先調(diào)用SecondActivity的onPause()方法,接著調(diào)用MainActivity的onRestart()、onStart()和onResume方法,由于是返回鍵返回,此時SecondActivity被銷毀,依次調(diào)用了onStop()和onDestroy()方法。402.2.2
Activity生命周期點擊按鈕SecondActivity返回到MainActivity此過程中首先調(diào)用SecondActivity的onPause()方法,接著調(diào)用MainActivity的onCreate()、onStart()和onResume方法,最后調(diào)用了SecondActivity的onStop()方法。比較圖2.2.4,此時的MainActivity被全新重建,與此同時SecondActivity也并沒有被銷毀,其資源仍占據(jù)著系統(tǒng)資源。412.2.2
Activity生命周期部分遮擋的情況AndroidManifest.xml文件中為SecondActivity添加屬性android:theme并且設(shè)置其值為android:theme="@android:style/Theme.Dialog"。此屬性定義SecondActivity顯示方式為窗口而不是整個屏幕。運行程序并從MainActivity中啟動SecondActivity,此過程System.out輸出信息如圖2.2.6所示。比較圖2.2.3,可以看出,部分遮擋的情況下,MainActivity不會調(diào)用自身的onStop()方法,這是因為MainActivity仍可見,只是不能直接和用戶交互。422.2.2
Activity生命周期Activity的生命周期中還需注意以下幾點:當(dāng)Activity處于暫?;蛲V?fàn)顟B(tài)下,操作系統(tǒng)內(nèi)存缺乏可能會銷毀Activity,或者其他意外突發(fā)情況,Activity被操作系統(tǒng)銷毀,內(nèi)存回收時onSaveInstanceState()會被調(diào)用,但是當(dāng)用戶主動銷毀一個Activity時(例如,按返回鍵)onSaveInstanceState()就不會被調(diào)用。onSaveInstanceState()適合保存一些臨時性的數(shù)據(jù),onPause()適合保存一些持久化的數(shù)據(jù)onRestoreInstanceState()是在onStart()和onCreate()之間執(zhí)行用戶恢復(fù)ActivityUI狀態(tài)。如果數(shù)據(jù)比較重要但是數(shù)據(jù)任在運算當(dāng)中,則應(yīng)該緩存他們,如果運算結(jié)束并且得到了結(jié)果,則應(yīng)該對其進行持久化操作。只要Activity被覆蓋一定會調(diào)用onPause()方法,只要Activity重新回到前臺一定會調(diào)用onResume()方法。432.2.3Task與Activity棧一個Task是用戶可以完成一個特定目標(biāo)的一組Activity,與Activity屬于哪個Application無關(guān)。除非明確地新建一個Task,否則用戶啟動的所有Activity都默認(rèn)是當(dāng)前Task的一部分。這些Activity可能屬于任何一個Application,屬于同一個Application或者屬于不同的Application。例如,從聯(lián)系人列表(第一個Activity)開始,然后選擇一個郵箱地址(第二個Activity),然后附加一個照片(第三個Activity),聯(lián)系人列表、郵箱和圖片,這些都存在于不同的Activity中,但卻屬于同一個Task。442.2.3Task與Activity棧啟動Task的Activity被稱作根Activity。通常,Task是從應(yīng)用管理器、主屏或者最近的Task(長按HOME鍵)開始的。用戶可以通過點擊根Activity的圖標(biāo)回到Task里去,就像啟動這個Activity一樣。在這個Task中,使用BACK鍵可以回到這個Task的前一個Activity里,Activity棧可以由一個或多個Task組成。452.2.3Task與Activity棧Task的一個重要的特性就是,用戶可以中斷其當(dāng)前正在進行的任務(wù),去進行另一個Task,然后可以返回到原來的那個Task去完成它,即打斷Task。這個特性的目的,就是用戶可以同時運行多個任務(wù),并且可以在這些任務(wù)間切換。有兩種主要的的情形離開一個Task:其一是用戶被Notification打斷,例如來了一個通知,用戶開始關(guān)注處理這個通知。其二是用戶決定開始另一個任務(wù),例如用戶按了HOME鍵,然后開始了另一個Application。遇到這兩種情況時,應(yīng)該注意能讓用戶返回到離開的那個任務(wù)。462.2.3Task與Activity棧當(dāng)用戶在Application中,從一個Activity跳到另一個時Activity,Android系統(tǒng)會保存一個用戶訪問Activity的線性導(dǎo)航歷史,這就是activity棧,也被稱為返回棧。一般來說,當(dāng)用戶運行一個新的Activity,這個Activity就會被加到Activity棧里。因此,當(dāng)用戶按BACK鍵的時候,棧中的上一個Activity就會被展示出來,用戶可以一直按BACK鍵,直到返回到了主屏Activity。把Activity加入到當(dāng)前棧里的操作,與Activity是否啟動了一個新Task無關(guān),但是返回操作可以使用戶從當(dāng)前Task回到上一個Task。用戶可以在應(yīng)用管理器、主屏、或者“最近Task”屏幕,恢復(fù)到剛剛的Task。472.2.3Task與Activity棧只有Activity可以加到Activity棧里去,
View、Window、Menu或者Dialog都能進行此種操作。假設(shè)界面A跳到界面B,然后用戶可以用BACK跳回界面A。這種情況下,界面A和界面B都要被實現(xiàn)成Activity。這個規(guī)則有一個例外的情況,那就是除非其應(yīng)用控制了BACK鍵并且自行管理界面導(dǎo)航。下面通過圖示介紹多個Activity互相調(diào)用時Activity棧的變化。如圖2.2.7所示,假設(shè)一個Application中包含四個Activity,為Activity1~Activity4。應(yīng)用程序啟動之后,運行第一個Activity1,Activity1對象被壓入到Stack當(dāng)中。在Activity1中啟動第二個Activity2,
Activity2對象被壓入到Stack當(dāng)中,由于手機顯示的總是位于Stack頂部的Activity,所以此時用戶看到的屏幕是Activity2。在Activity2中啟動第三個Activity3,
Activity3對象被壓入到Stack當(dāng)中,用戶看到的屏幕變成Activity3。在Activity3中啟動最后一個Activity4,Activity4對象被壓入到Stack當(dāng)中,手機屏幕變成Activity4。點擊BACK按鈕,這時Activity4對象在棧中被彈出,第三個Activity置于棧頂,依次點擊BACK按鈕,最后可返回到主屏幕Activity1。482.2.3Task與Activity棧492.2.3Task與Activity棧Activity棧:遵循“后進先出”的規(guī)則502.2.4Activity基本狀態(tài)Android系統(tǒng)中,Activity的四種基本狀態(tài):活動態(tài)(Active/Running):Activity在用戶界面中處于最上層,完全能被用戶看到,能夠與用戶進行交互。暫停態(tài)(Paused):Activity界面上被部分遮擋,該Activity不再處于用戶界面的最上層,且不能夠與用戶進行交互。停止態(tài)(Stopped):Activity在界面上完全不能被用戶看到,也就是說這個Activity被其他Activity全部遮擋。非活動態(tài)(Killed):又稱為死亡態(tài),是指不在上面三種狀態(tài)中之內(nèi)的Activity狀態(tài)。512.2.4Activity基本狀態(tài)Activity四種基本狀態(tài)的轉(zhuǎn)關(guān)系及回調(diào)函數(shù)如下圖所示522.3Intent信使
2.3.1Intent基本構(gòu)成2.3.2Intent形式2.3.3IntentFilter2.3.4Activity信息傳遞53 Intent是一個動作的完整描述,包含了動作的產(chǎn)生組件、接收組件和傳遞的數(shù)據(jù)信息。Intent本身是一個對象,是一個被動的數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)包含被執(zhí)行動作的抽象描述,所以Intent也可稱為一個在不同組件之間傳遞的消息,這個消息在到達(dá)接收組件后,接收組件會執(zhí)行相關(guān)的動作。2.3Intent信使542.3.1Intent基本構(gòu)成Intent對象抽象地描述了要執(zhí)行的動作,其描述的基本內(nèi)容分為六部分:組件名稱(ComponentName)動作(Action)數(shù)據(jù)(Data)類別(Category)附加信息(Extra)標(biāo)志(Flag)552.3.1Intent基本構(gòu)成組件名稱ComponentName組件名稱是指Intent目標(biāo)組件的名稱,組件名稱是一個ComponentName對象,這種對象名稱是目標(biāo)組件完全限定類名和目標(biāo)組件所在應(yīng)用程序的包名的組合。組件名字通過setComponent(),setClass()或setClassName()設(shè)置,通過getComponent()讀取。動作Action:Action描述Intent所觸發(fā)動作名字的字符串,對于BroadcastIntent來說,Action指被廣播出去的動作。理論上Action可以為任何字符串,而與Android系統(tǒng)應(yīng)用有關(guān)的Action字符串以靜態(tài)字符串常量的形式定義在了Intent類中。常見動作見表156數(shù)據(jù)Data數(shù)據(jù)是描述Intent要操作的數(shù)據(jù)URI和數(shù)據(jù)MIME類型,不同的動作有不同的數(shù)據(jù)規(guī)格。匹配一個Intent到一個能夠處理數(shù)據(jù)的組件,通常需要知道數(shù)據(jù)的類型(它的MIME類型)和它的URI。類別Category類別指定了將要執(zhí)行Action的其他一些額外的信息,Android系統(tǒng)支持常見的類別字符串常量如表2所示。2.3.1Intent基本構(gòu)成572.3.1Intent基本構(gòu)成表1Android系統(tǒng)支持用于Activity組件的常見的動作字符串常量動作說明ACTION_ANSWER打開接聽電話的Activity,默認(rèn)為Android內(nèi)置的撥號盤界面ACTION_CALL打開撥號盤界面并撥打電話,使用Uri中的數(shù)字部分作為電話號碼ACTION_DELETE打開一個Activity,對所提供的數(shù)據(jù)進行刪除操作ACTION_DIAL打開內(nèi)置撥號盤界面,顯示Uri中提供的電話號碼ACTION_EDIT打開一個Activity,對所提供的數(shù)據(jù)進行編輯操作ACTION_INSERT打開一個Activity,在提供數(shù)據(jù)的當(dāng)前位置插入新項ACTION_PICK啟動一個子Activity,從提供的數(shù)據(jù)列表中選取一項ACTION_SEARCH啟動一個Activity,執(zhí)行搜索動作ACTION_SENDTO啟動一個Activity,向數(shù)據(jù)提供的聯(lián)系人發(fā)送信息ACTION_SEND啟動一個可以發(fā)送數(shù)據(jù)的ActivityACTION_VIEW最常用的動作,對以Uri方式傳送的數(shù)據(jù),根據(jù)Uri協(xié)議部分以最佳方式啟動相應(yīng)的Activity進行處理。對于http:address將打開瀏覽器查看;對于tel:address將打開撥號呼叫指定的電話號碼ACTION_WEB_SEARCH打開一個Activity,對提供的數(shù)據(jù)進行Web搜索582.3.1Intent基本構(gòu)成表2Android系統(tǒng)支持常見的類別字符串常量值說明ALTERNATIVEIntent數(shù)據(jù)默認(rèn)動作的一個可替換的執(zhí)行方法SELECTED_ALTERNATIVE和ALTERNATIVE類似,但替換的執(zhí)行方法不是指定的,而是被解析出來的BROWSABLE聲明Activity可以由瀏覽器啟動DEFAULT為Intent過濾器中定義的數(shù)據(jù)提供默認(rèn)動作HOME設(shè)備啟動后顯示的第一個ActivityLAUNCHER在應(yīng)用程序啟動時首先被顯示59附加信息Extra額外的附加信息,是其它所有附加信息的集合。使用extras可以為組件提供擴展信息,當(dāng)使用Intent連接不同的組件時,有時需要在Intent中附加額外的信息,以便將數(shù)據(jù)傳遞給目標(biāo)Activity。Extra用鍵值對結(jié)構(gòu)保存在Intent對象當(dāng)中,Intent對象通過調(diào)用方法putExtras()和getExtras()來存儲和獲取Extra。在Intent類中同樣為Android系統(tǒng)應(yīng)用的一些Exrta的鍵值定義了靜態(tài)的字符串常量,如下表所示。標(biāo)記Flag指示Android系統(tǒng)如何去啟動一個Activity和啟動之后的處理。例如,活動應(yīng)該屬于那個任務(wù),是否屬于最近的活動列表。通常使用setFlags()方法和addFlags()方法設(shè)置和添加。2.3.1Intent基本構(gòu)成60表3Android系統(tǒng)支持常見的Extra字符串常量值說明EXTRA_BCC裝有郵件密送地址的字符串?dāng)?shù)組EXTRA_CC裝有郵件抄送地址的字符串?dāng)?shù)組EXTRA_EMAIL裝有郵件發(fā)送地址的字符串?dāng)?shù)組EXTRA_INTENT使用ACTION_PICK_ACTIVITY動作時裝有Intent選項的鍵EXTRA_KEY_EVENT觸發(fā)該Intent的按鍵的KeyEvent對象EXTRA_PHONE_NUMBER使用撥打電話相關(guān)的Action時,電話號碼字符串的鍵,類型為StringEXTRA_SHORTCUT_ICON使用ACTION_CREATE_SHORTCUT在Activity創(chuàng)建快捷方式時,對快捷方式的描述信息。ICON和ICON_RESOURCE描述的是快捷方式的圖標(biāo),類型分別為Bitmap和ShortcutIconResource。INTENT描述的是快捷方式相對應(yīng)的Intent對象。NAME描述的是快捷方式的名字。EXTRA_SHORTCUT_ICON_RESOURCEEXTRA_SHORTCUT_INTENTEXTRA_SHORTCUT_NAMEEXTRA_SUBJECT描述信息主體的鍵EXTRA_TEXT使用ACTION_SEND動作時,用來描述要發(fā)送的文本信息,類型是ChatSequenceEXTRA_TITLE使用ACTION_CHOOSER動作時,描述對話框標(biāo)題的鍵,類型是ChatSequenceEXTRA_UID使用ACTION_UID_REMOVED動作時,描述刪除用戶Id的鍵,類型為Int612.3.2Intent形式Android系統(tǒng)中有兩種Intent形式,分別為顯式Intent和隱式Intent。顯式Intent(ExplicitIntents)指定了目標(biāo)組件,一般調(diào)用setComponent()或者setClass(Context,Class)設(shè)定Intents的component屬性,指定具體的組件類。這些Intent一般不包括包括其它任何信息,通常用于應(yīng)用程序內(nèi)部消息,如一個Activity啟動從屬的服務(wù)或啟動另一個Activity。隱式Intent(ImplicitIntents)沒有明確指明目標(biāo)組件,經(jīng)常用于啟動其他應(yīng)用程序中的組件。622.3.2Intent形式啟動Activity顯式啟動使用Intent顯式啟動Activity創(chuàng)建一個Intent指定當(dāng)前的應(yīng)用程序上下文以及要啟動的Activity把創(chuàng)建好的這個Intent作為參數(shù)傳遞給startActivity()方法Intentintent=newIntent(IntentDemo.this,ActivityToStart.class);startActivity(intent);63舉例:建立一個新的Android工程工程名稱:Chp02_IntentStartDirectlyActivity名稱:MainActivity,SecondActivityIntent顯式啟動SecondActivity64AndroidManifest.xml文件中聲明Activity的代碼如下:……<applicationandroid:icon="@drawable/icon“android:label="@string/app_name">2<activityandroid:name=".MainActivity"3android:label="@string/app_name">4<intent-filter>5<actionandroid:name="ent.action.MAIN"/>6<categoryandroid:name="ent.category.LAUNCHER"/>7</intent-filter>8</activity>9<activityandroid:name=".SecondActivity"10android:label="@string/app_name">11</activity>12</application>……2.3.2Intent形式65MainActivity.java文件的代碼……1publicclassMainActivityextendsActivity{2 privateButtonm_btnMainAct=null;3/**Calledwhentheactivityisfirstcreated.*/4@Override5publicvoidonCreate(BundlesavedInstanceState){6super.onCreate(savedInstanceState);7setContentView(R.layout.main);8m_btnMainAct=(Button)findViewById(R.id.btnMainAct);9m_btnMainAct.setOnClickListener(newOnClickListener(){10publicvoidonClick(Viewview){11 //聲明一個Intent對象12 IntentinttMainAct=newIntent(MainActivity.this,SecondActivity.class);13 //Intent顯示啟動Activity14 startActivity(inttMainAct);15 }16});17}18}……662.3.2Intent形式
代碼12行采用了第五種構(gòu)造函數(shù)形式,指明了主調(diào)組件MainActivity和目標(biāo)組件SecondActivity。startActivity()方法啟動Intent指向的Activity。上面代碼使用了Activity顯示啟動的方式,直接指明了需要啟動的Activity。Intent類定義了六種構(gòu)造函數(shù)。Intent();Intent(Intento);Intent(Stringaction);Intent(Stringaction,Uriuri);Intent(ContextpackageContext,Class<?>cls);Intent(Stringaction,Uriuri,ContextpackageContext,Class<?>cls);第一種為空構(gòu)造函數(shù),調(diào)用此構(gòu)造函數(shù)的Intent為一個空Intent對象。第二種的參數(shù)也是一個Intent對象,通過復(fù)制該對象初始化新的Intent對象。第三種構(gòu)造函數(shù)指定了動作Action的類型,第四種構(gòu)造函數(shù)有兩個參數(shù)分別為指定了動作Action和UriData。第五種構(gòu)造函數(shù)指定了主調(diào)組件和目標(biāo)組件。第六種構(gòu)造函數(shù)擁有三個參數(shù),描述了動作Action、數(shù)據(jù)Data和目標(biāo)組件。67啟動Activity隱式啟動優(yōu)點:不需要指明需要啟動哪一個Activity,而由Android系統(tǒng)來決定,有利于使用第三方組件隱式啟動Activity時,Android系統(tǒng)在應(yīng)用程序運行時解析Intent,并根據(jù)一定的規(guī)則對Intent和Activity進行匹配,使Intent上的動作、數(shù)據(jù)與Activity完全吻合匹配的Activity可以是應(yīng)用程序本身的,也可以是Android系統(tǒng)內(nèi)置的,還可以是第三方應(yīng)用程序提供的。因此,這種方式更加強調(diào)了Android應(yīng)用程序中組件的可復(fù)用性682.3.2Intent形式
下面代碼為隱式啟動Activity的Intent示例。IntentinttMainAct=newIntent(Intent.ACTION_VIEW,Uri.parse(“”));startActivity(inttMainAct);Intent的動作是Intent.ACTION_VIEW,根據(jù)URI的數(shù)據(jù)類型來匹配動作。數(shù)據(jù)部分的URI是Web地址,使用Uri.parse(urlString)方法,可以簡單的把一個字符串解釋成Uri對象。顯然Intent構(gòu)造函數(shù)采用的是第四種格式,此代碼的意義就是隱式調(diào)用系統(tǒng)內(nèi)部的Web瀏覽器,打開網(wǎng)址。692.3.3IntentFilterIntent-Filter,即Intent過濾器,是Android系統(tǒng)提供的一種機制,根據(jù)Intent中的動作Action、類別Categorie和數(shù)據(jù)Data等內(nèi)容,對適合接收該Intent的組件進行匹配和篩選,用于隱式啟動組件過程中。Android應(yīng)用程序中Activity組件、Service組件和BroadcastReceiver都可以注冊Intent過濾器,可以注冊一個也可以注冊多個。組件注冊Intent過濾器常見的方法是在AndroidManifest.xml文件中用節(jié)點<Intent-Filter>描述。70IntentFilter所支持的屬性2.3.3IntentFilter標(biāo)簽屬性說明<action>android:name指定組件所能響應(yīng)的動作,用字符串表示,通常使用Java類名和包的完全限定名構(gòu)成<category>android:category指定以何種方式去服務(wù)Intent請求的動作<data>android:host指定一個有效的主機名android:mimetype指定組件能處理的數(shù)據(jù)類型android:path有效的URI路徑名android:port主機的有效端口號android:scheme所需要的特定的協(xié)議71Android系統(tǒng)中Intent過濾器的匹配規(guī)則可以概括成以下四點:Android系統(tǒng)把所有應(yīng)用程序包中的Intent過濾器集合在一起,形成一個完整的Intent過濾器列表.在Intent與Intent過濾器進行匹配時,Android系統(tǒng)會將列表中所有Intent過濾器的動作和類別與Intent進行匹配,任何不匹配的Intent過濾器都將被過濾掉。2.3.3IntentFilter72把Intent數(shù)據(jù)Uri的每個子部與Intent過濾器的<data>標(biāo)簽中的屬性進行匹配,如果<data>標(biāo)簽指定了協(xié)議、主機名、路徑名或MIME類型,那么這些屬性都要與Intent的Uri數(shù)據(jù)部分進行匹配,任何不匹配的Intent過濾器均被過濾掉。如果Intent過濾器的匹配結(jié)果多于一個,則可以根據(jù)在<intent-filter>標(biāo)簽中定義的優(yōu)先級標(biāo)簽來對Intent過濾器進行排序,優(yōu)先級最高的Intent過濾器將被選擇。2.3.3IntentFilter732.3.4Activity信息傳遞在開發(fā)Android應(yīng)用程序過程中,Activity之間進行信息傳遞不可避免。Activity之間信息傳遞最常見的情形有兩種,一種是獲取子Activity返回值,另一種傳遞消息給子Activity。下面通過一個例子具體實現(xiàn)上述兩種Activity之間進行信息傳遞的情形。建立工程NeuChp02_IntentExchangeMessage,實現(xiàn)三個Activity,分別為MainActivity、SecondActivity和ThirdActivity,其中MainActivity為父Activity,獲取SecondActivity的返回值,傳遞信息給ThirdActivity74MainActivity.java文件代碼如下:2.3.4Activity信息傳遞1publicclassMainActivityextendsActivity{2 privateButtonm_btnGetActReturnMainAct=null;3 privateButtonm_btnBroadCastMainAct=null;4 privateEditTextm_etxtGetActReturnMainAct=null;5 privateEditTextm_etxtBroadCastMainAct=null;6 privatestaticfinalintINFORMATIONACT=1;7/**Calledwhentheactivityisfirstcreated.*/8@Override9publicvoidonCreate(BundlesavedInstanceState){10super.onCreate(savedInstanceState);11setContentView(R.layout.main);12m_btnGetActReturnMainAct=(Button)findViewById(R.id.btnGetActReturnMainAct);13m_btnBroadCastMainAct=(Button)findViewById(R.id.btnBroadCastMainAct);14m_etxtGetActReturnMainAct=(EditText)findViewById(R.id.etxtGetActReturnMainAct);15m_etxtBroadCastMainAct=(EditText)findViewById(R.id.etxtBroadCastMainAct);16m_btnGetActReturnMainAct.setOnClickListener(newOnClickListener(){17publicvoidonClick(Viewview){18 //獲取Activity返回值啟動SecondActivity19 IntentinttMainAct=newIntent(MainActivity.this,SecondActivity.class);20 startActivityForResult(inttMainAct,INFORMATIONACT);21}22});23m_btnBroadCastMainAct.setOnClickListener(newOnClickListener(){24publicvoidonClick(Viewview){25 //傳遞信息值752.3.4Activity信息傳遞26 IntentinttMainAct=newIntent(MainActivity.this,ThirdActivity.class);27 St
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建省南平市武夷山第二中學(xué)2021年高三物理上學(xué)期期末試卷含解析
- 個人車位買賣協(xié)議書模板
- 2024廣告裝飾工程合作合同典范版B版
- 1假期有收獲 說課稿-2024-2025學(xué)年道德與法治二年級上冊統(tǒng)編版
- 汽車設(shè)計的創(chuàng)新之路
- 科技驅(qū)動的環(huán)保革新
- 外出經(jīng)營合同(2篇)
- 基礎(chǔ)設(shè)施合作投資協(xié)議書(2篇)
- 2024年網(wǎng)絡(luò)平臺蔬菜水果銷售合同3篇
- 15-1《諫太宗十思疏》說課稿 2023-2024學(xué)年統(tǒng)編版高中語文必修下冊
- 數(shù)學(xué)分析知識點的總結(jié)
- 產(chǎn)科操作技術(shù)規(guī)范范本
- 2023年重癥醫(yī)學(xué)科護理工作計劃
- 年會抽獎券可編輯模板
- 感染性疾病標(biāo)志物及快速診斷課件(PPT 134頁)
- YC∕T 273-2014 卷煙包裝設(shè)計要求
- 2022年煤礦地面消防應(yīng)急預(yù)案范文
- 高中化學(xué)必修二第三章第一節(jié)認(rèn)識有機化合物課件
- 水上拋石護坡施工方案
- 4PL的供應(yīng)鏈整合及其對區(qū)域發(fā)展的借鑒意義
- 物料提升機基礎(chǔ)方案
評論
0/150
提交評論