版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第二章Android生命周期與組件通信1主要內容2.1Android生命周期2.2Activity組件2.3Intent信使22.1Android生命周期程序的生命周期程序的生命周期是在Android系統(tǒng)中進程從啟動到終止的所有階段,也就是Android程序啟動到停止的全過程。程序的生命周期由Android系統(tǒng)進行調度和控制的。Android系統(tǒng)中的進程優(yōu)先級由高到低前臺進程可見進程服務進程后臺進程空進程3前臺進程前臺進程是Android系統(tǒng)中最重要的進程,是與用戶正在交互的進程,包含以下四種情況。進程中的Activity正在與用戶進行交互。進程服務被Activity調用,而且這個Activity正在與用戶進行交互。進程服務正在執(zhí)行聲明周期中的回調函數(shù),如onCreate()、onStart()或onDestroy()。進程的BroadcastReceiver正在執(zhí)行onReceive()函數(shù)。Android系統(tǒng)在多個前臺進程同時運行時,可能會出現(xiàn)資源不足的情況,此時會清除部分前臺進程,保證主要的用戶界面能夠及時響應。2.1Android生命周期4可見進程可見進程指部分程序界面能夠被用戶看見,卻不在前臺與用戶交互,不響應界面事件的進程。如果一個進程包含服務,且這個服務正在被用戶可見的Activity調用,此進程同樣被視為可見進程。Android系統(tǒng)一般存在少量的可見進程,只有在特殊的情況下,Android系統(tǒng)才會為保證前臺進程的資源而清除可見進程。2.1Android生命周期5服務進程服務進程是指包含已啟動服務的進程沒有用戶界面在后臺長期運行Android系統(tǒng)除非不能保證前臺進程或可視進程所必要的資源,否則不強行清除服務進程后臺進程后臺進程是指不包含任何已經(jīng)啟動的服務,而且沒有任何用戶可見的Activity的進程Android系統(tǒng)中一般存在數(shù)量較多的后臺進程,在系統(tǒng)資源緊張時,系統(tǒng)將優(yōu)先清除用戶較長時間沒有見到的后臺進程2.1Android生命周期6空進程空進程是不包含任何活躍組件的進程空進程在系統(tǒng)資源緊張時會被首先清除但為了提高Android系統(tǒng)應用程序的啟動速度,Android系統(tǒng)會將空進程保存在系統(tǒng)內存用,在用戶重新啟動該程序時,空進程會被重新使用除了以上的優(yōu)先級外,以下兩方面也決定他們的優(yōu)先級進程的優(yōu)先級取決于所有組件中的優(yōu)先級最高的部分進程的優(yōu)先級會根據(jù)與其他進程的依賴關系而變化2.1Android生命周期72.2Activity組件
2.2.1Android組件簡介2.2.2Activity生命周期2.2.3Task與Activity棧2.2.4Activity基本狀態(tài)82.2.1Android組件簡介組件是可以調用的基本功能模塊,Android應用程序就是由組件組成的。Android系統(tǒng)有四個重要的組件,分別是Activity、Service、BroadcastReceiver和ContentProvider。ActivityActivity是Android程序的呈現(xiàn)層,顯示可視化的用戶界面,并接收與用戶交互所產(chǎn)生的界面事件。Android應用程序可以包含一個或多個Activity,一般在程序啟動后會呈現(xiàn)一個Activity,用于提示用戶程序已經(jīng)正常啟動。在界面上的表現(xiàn)形式:全屏窗體,非全屏懸浮窗體,對話框。ServiceService用于沒有用戶界面,但需要長時間在后臺運行的應用。92.2.1Android組件簡介BroadcastReceiverBroadcastReceiver是用來接受并響應廣播消息的組件。不包含任何用戶界面??梢酝ㄟ^啟動Activity或者Notification通知用戶接收到重要信息。Notification能夠通過多種方法提示用戶,包括閃動背景燈、震動設備、發(fā)出聲音或在狀態(tài)欄上放置一個持久的圖標。ContentProviderContentProvider是Android系統(tǒng)提供的一種標準的共享數(shù)據(jù)的機制,應用程序可以通過ContentProvider訪問其他應用程序的私有數(shù)據(jù)。私有數(shù)據(jù)可以是存儲在文件系統(tǒng)中的文件,也可以是SQLite中的數(shù)據(jù)庫。Android系統(tǒng)內部也提供一些內置的ContentProvider,能夠為應用程序提供重要的數(shù)據(jù)信息。102.2.2Activity生命周期Activity生命周期Activity生命周期指Activity從啟動到銷毀的過程。Activity表現(xiàn)為四種狀態(tài),分別是活動狀態(tài)、暫停狀態(tài)、停止狀態(tài)和非活動狀態(tài)?;顒訝顟B(tài),Activity在用戶界面中處于最上層,完全能用戶看到,能夠與用戶進行交互。暫停狀態(tài),Activity在界面上被部分遮擋,該Activity不再處于用戶界面的最上層,且不能夠與用戶進行交互。停止狀態(tài),Activity在界面上完全不能被用戶看到,也就是說這個Activity被其他Activity全部遮擋。非活動狀態(tài)不在以上三種狀態(tài)中的Activity則處于非活動狀態(tài)。112.2.2Activity生命周期Activity的四種狀態(tài)的變換關系圖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行復寫了基類的onCreate()方法,并且在14行調用了父類的onCreate()方法,這在創(chuàng)建Activity時同樣是必須的,在Activity第一次運行時總會首先執(zhí)行onCreate()方法,此方法作用類似于其它面向對象語言中的構造函數(shù)。代碼15行采用setContentView()方法設置布局文件,代碼16和17行的findViewById()方法功能是通過控件ID屬性獲得所需的控件對象,此方法返回View類,View類是android系統(tǒng)的控件基類,可以通過強制類型轉換轉化成所需的控件對象。代碼18行和19行完成相應控件顯示文本的設置。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生命周期在應用程序application元素中聲明了前面所定義的Activity,在application元素中同樣可以聲明Service、BroadcastReceiver和ContentProvider。代碼第2行屬性android:name定義了實現(xiàn)Activity類的名稱,其值有兩種實現(xiàn)形式,一種是使用全稱com.NewActivity,另外一種是使用簡化后的類名稱.NewActivity,其中的“.”不可省略。第3行屬性android:label定義了Activity的標簽名稱,此名稱將在Activity界面上面以標題形式顯示,@string/app_name是一種資源引用方式,其真實值是res/values/string.xml文件中app_name元素代表的字符串值。intent-filter元素中包含了兩個子元素action和category,這些元素的意義將在后面詳細介紹,在這里intent-filter的功能就是設置程序的啟動主窗體為包含它的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定義控件橫向寬度,屬性android:layout_height定義控件縱向高度,屬性android:layout_width和屬性android:layout_height的可選值均為fill_parent與wrap_content。fill_parent值代表填充父控件,wrap_content值代表按照內容填充。屬性android:id定義控件唯一標識名稱,“@+id”告訴系統(tǒng)在R.java文件中生成相應的值。在生命周期中起重要作用的是它的事件回調函數(shù)。Activity提供了七個生命周期的事件回調函數(shù),在這些事件回調函數(shù)中添加相應的功能代碼可以實現(xiàn)或者完成相應的功能。192.2.2Activity生命周期事件的回調函數(shù)publicclassMyActivityextendsActivity{protectedvoidonCreate(BundlesavedInstanceState);protectedvoidonStart();protectedvoidonRestart();protectedvoidonResume();protectedvoidonPause();protectedvoidonStop();protectedvoidonDestroy();}202.2.2Activity生命周期Activity生命周期的事件回調函數(shù)函數(shù)是否
可終止說明onCreate()否Activity啟動后第一個被調用的函數(shù),常用來進行Activity的初始化,例如創(chuàng)建View、綁定數(shù)據(jù)或恢復信息等。onStart()否當Activity顯示在屏幕上時,該函數(shù)被調用。onRestart()否當Activity從停止狀態(tài)進入活動狀態(tài)前,調用該函數(shù)。onResume()否當Activity能夠與用戶交互,接受用戶輸入時,該函數(shù)被調用。此時的Activity位于Activity棧的棧頂。onPause()是當Activity進入暫停狀態(tài)時,該函數(shù)被調用。一般用來保存持久的數(shù)據(jù)或釋放占用的資源。onStop()是當Activity進入停止狀態(tài)時,該函數(shù)被調用。onDestroy()是在Activity被終止前,即進入非活動狀態(tài)前,該函數(shù)被調用。212.2.2Activity生命周期Activity狀態(tài)保存/恢復的事件回調函數(shù)函數(shù)是否
可終止說明onSaveInstanceState()否Android系統(tǒng)因資源不足終止Activity前調用該函數(shù),用以保存Activity的狀態(tài)信息,供onRestoreInstanceState()或onCreate()恢復之用。onRestoreInstanceState()否恢復onSaveInstanceState()保存的Activity狀態(tài)信息,在onStart()和onResume()之間被調用。22Activity事件回調函數(shù)的調用順序232.2.2
Activity生命周期全生命周期函數(shù)的調用順序:onCreate()→onStart()→onResume()→onPause()→onStop()→onDestroy()調用onCreate()函數(shù)分配資源調用onStart()將Activity顯示在屏幕上調用onResume()獲取屏幕焦點調用onPause()、onStop()和onDestroy(),釋放資源并銷毀進程242.2.2
Activity生命周期全生命周期運行程序,啟動MainActivity完成后,查看日志過濾器中的System.out信息如圖2.2.2(a)。如果此時再按下模擬器的返回鍵,則相當于關閉了MainActivity,日志過濾器中的System.out信息變成了如圖2.2.2(b)。圖2.2.2(a)MainActivity啟動日志圖2.2.2(b)MainActivity全生命周期日志252.2.2
Activity生命周期可視生命周期可視生存期(VisibleLifetime)是指從調用onStart()開始到調用onStop()結束之間的周期階段。在這段時間里,Activity對用戶是可見的,但是它有可能不是用戶所關注的Activity,或者它可能被部分遮擋了。當Activity界面不可見的時候更新它是沒有意義的,因為這樣子消耗了資源卻沒有起到實際的作用。當Activity界面再次可見的時候,可以使用onStart()或者onRestart()來恢復或者重啟這些進程。onRestart()方法在onStart()方法前被調用,用于Activity從不可見變?yōu)榭梢姷倪^程,進行特定處理。Activity經(jīng)常在可見和不可見的狀態(tài)多次轉換,所以onStart()和onStop()多次被調用。另外,onStart()和onStop()同樣也用于注冊和銷毀BroadcastReceive。262.2.2
Activity生命周期可視生命周期函數(shù)的調用順序:
onSaveInstanceState()→onPause()→onStop()→onRestart()→onStart()→onResume()調用onSaveInstanceState()函數(shù)保存Activity狀態(tài)調用onPause()和onStop(),停止對不可見Activity的更新調用onRestart()恢復需要界面上需要更新的信息調用onStart()和onResume()重新顯示Activity,并接受用戶交互272.2.2
Activity生命周期活動生命周期活動生存期(ForegroundLifetime)指調用onResume()及其對應的onPause()之間的那段生存期,此時,Activity在屏幕的最上層,能夠與用戶直接交互。在活動生存期內可以安全的假設onSaveInstanceState()和onPause()會被調用,大部分Activity至少需重寫onPause()方法來提交未保存的改動,因為在onPause()之外Activity可能在沒有任何警告的情況下被終止。在Activity不在前臺的時候也可以根據(jù)應用程序的架構,選擇掛起線程、進程或者廣播接收器。onResume()方法可以是輕量級的,因為要求加載Activity界面的時候可以由onCreate()和onRestoreIntanceState()方法處理。使用onResume()可以重新注冊已經(jīng)使用onPause()停止的廣播接收器或者其他進程。onPause()最好也是輕量級的,因為下一個要顯示到前臺的activity的onRsume()要等當前activity的onPause返回后才執(zhí)行。所以,盡量讓onPause()方法中的代碼執(zhí)行迅速,讓onResume()方法中的代碼盡可能少,以保證在前臺和后臺之間進行切換的時候程序能夠保持響應。282.2.2
Activity生命周期活動生命周期函數(shù)調用順序如下:onSaveInstanceState()→onPause()→onResume()調用onSaveInstanceState()保存Activity的狀態(tài)調用onPause()停止與用戶交互調用onResume()恢復與用戶的交互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的七個生命周期回調函數(shù),并均使用方法System.out.println(),此方法向控制臺輸出相應信息并換行。代碼53行通過內部類實現(xiàn)按鈕點擊監(jiān)聽器。代碼56-58行,通過Intent實現(xiàn)不同Activity的交互,Intent會在后面的內容中詳細介紹。ButtonListener類實現(xiàn)的功能是按鈕點擊后的響應,即啟動另一個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運行時信息和應用程序信息等。通過在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調用SecondActivity日志重新運行上面的工程,MainActivity啟動完成后,System.out信息同圖2.2.2(a),此時點擊上面的按鈕啟動SecondActivity,查看System.out信息,如圖2.2.3所示。從圖中可以看出,前三行信息是MainActivity的啟動日志,后面五行是MainActivity中啟動SecondActivity的日志。SecondActivity的啟動過程中,首先調用MainActivity的onPause()方法,再依次調用SecondActivity的onCreate()、onStart()和onResume(),最后調用MainActivity的onStop()方法,此時SecondActivity完全遮蓋MainActivity。392.2.2
Activity生命周期從SecondActivity返回到MainActivity日志此過程中首先調用SecondActivity的onPause()方法,接著調用MainActivity的onRestart()、onStart()和onResume方法,由于是返回鍵返回,此時SecondActivity被銷毀,依次調用了onStop()和onDestroy()方法。402.2.2
Activity生命周期點擊按鈕SecondActivity返回到MainActivity此過程中首先調用SecondActivity的onPause()方法,接著調用MainActivity的onCreate()、onStart()和onResume方法,最后調用了SecondActivity的onStop()方法。比較圖2.2.4,此時的MainActivity被全新重建,與此同時SecondActivity也并沒有被銷毀,其資源仍占據(jù)著系統(tǒng)資源。412.2.2
Activity生命周期部分遮擋的情況AndroidManifest.xml文件中為SecondActivity添加屬性android:theme并且設置其值為android:theme="@android:style/Theme.Dialog"。此屬性定義SecondActivity顯示方式為窗口而不是整個屏幕。運行程序并從MainActivity中啟動SecondActivity,此過程System.out輸出信息如圖2.2.6所示。比較圖2.2.3,可以看出,部分遮擋的情況下,MainActivity不會調用自身的onStop()方法,這是因為MainActivity仍可見,只是不能直接和用戶交互。422.2.2
Activity生命周期Activity的生命周期中還需注意以下幾點:當Activity處于暫?;蛲V範顟B(tài)下,操作系統(tǒng)內存缺乏可能會銷毀Activity,或者其他意外突發(fā)情況,Activity被操作系統(tǒng)銷毀,內存回收時onSaveInstanceState()會被調用,但是當用戶主動銷毀一個Activity時(例如,按返回鍵)onSaveInstanceState()就不會被調用。onSaveInstanceState()適合保存一些臨時性的數(shù)據(jù),onPause()適合保存一些持久化的數(shù)據(jù)onRestoreInstanceState()是在onStart()和onCreate()之間執(zhí)行用戶恢復ActivityUI狀態(tài)。如果數(shù)據(jù)比較重要但是數(shù)據(jù)任在運算當中,則應該緩存他們,如果運算結束并且得到了結果,則應該對其進行持久化操作。只要Activity被覆蓋一定會調用onPause()方法,只要Activity重新回到前臺一定會調用onResume()方法。432.2.3Task與Activity棧一個Task是用戶可以完成一個特定目標的一組Activity,與Activity屬于哪個Application無關。除非明確地新建一個Task,否則用戶啟動的所有Activity都默認是當前Task的一部分。這些Activity可能屬于任何一個Application,屬于同一個Application或者屬于不同的Application。例如,從聯(lián)系人列表(第一個Activity)開始,然后選擇一個郵箱地址(第二個Activity),然后附加一個照片(第三個Activity),聯(lián)系人列表、郵箱和圖片,這些都存在于不同的Activity中,但卻屬于同一個Task。442.2.3Task與Activity棧啟動Task的Activity被稱作根Activity。通常,Task是從應用管理器、主屏或者最近的Task(長按HOME鍵)開始的。用戶可以通過點擊根Activity的圖標回到Task里去,就像啟動這個Activity一樣。在這個Task中,使用BACK鍵可以回到這個Task的前一個Activity里,Activity棧可以由一個或多個Task組成。452.2.3Task與Activity棧Task的一個重要的特性就是,用戶可以中斷其當前正在進行的任務,去進行另一個Task,然后可以返回到原來的那個Task去完成它,即打斷Task。這個特性的目的,就是用戶可以同時運行多個任務,并且可以在這些任務間切換。有兩種主要的的情形離開一個Task:其一是用戶被Notification打斷,例如來了一個通知,用戶開始關注處理這個通知。其二是用戶決定開始另一個任務,例如用戶按了HOME鍵,然后開始了另一個Application。遇到這兩種情況時,應該注意能讓用戶返回到離開的那個任務。462.2.3Task與Activity棧當用戶在Application中,從一個Activity跳到另一個時Activity,Android系統(tǒng)會保存一個用戶訪問Activity的線性導航歷史,這就是activity棧,也被稱為返回棧。一般來說,當用戶運行一個新的Activity,這個Activity就會被加到Activity棧里。因此,當用戶按BACK鍵的時候,棧中的上一個Activity就會被展示出來,用戶可以一直按BACK鍵,直到返回到了主屏Activity。把Activity加入到當前棧里的操作,與Activity是否啟動了一個新Task無關,但是返回操作可以使用戶從當前Task回到上一個Task。用戶可以在應用管理器、主屏、或者“最近Task”屏幕,恢復到剛剛的Task。472.2.3Task與Activity棧只有Activity可以加到Activity棧里去,
View、Window、Menu或者Dialog都能進行此種操作。假設界面A跳到界面B,然后用戶可以用BACK跳回界面A。這種情況下,界面A和界面B都要被實現(xiàn)成Activity。這個規(guī)則有一個例外的情況,那就是除非其應用控制了BACK鍵并且自行管理界面導航。下面通過圖示介紹多個Activity互相調用時Activity棧的變化。如圖2.2.7所示,假設一個Application中包含四個Activity,為Activity1~Activity4。應用程序啟動之后,運行第一個Activity1,Activity1對象被壓入到Stack當中。在Activity1中啟動第二個Activity2,
Activity2對象被壓入到Stack當中,由于手機顯示的總是位于Stack頂部的Activity,所以此時用戶看到的屏幕是Activity2。在Activity2中啟動第三個Activity3,
Activity3對象被壓入到Stack當中,用戶看到的屏幕變成Activity3。在Activity3中啟動最后一個Activity4,Activity4對象被壓入到Stack當中,手機屏幕變成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)中之內的Activity狀態(tài)。512.2.4Activity基本狀態(tài)Activity四種基本狀態(tài)的轉關系及回調函數(shù)如下圖所示522.3Intent信使
2.3.1Intent基本構成2.3.2Intent形式2.3.3IntentFilter2.3.4Activity信息傳遞53 Intent是一個動作的完整描述,包含了動作的產(chǎn)生組件、接收組件和傳遞的數(shù)據(jù)信息。Intent本身是一個對象,是一個被動的數(shù)據(jù)結構,該數(shù)據(jù)結構包含被執(zhí)行動作的抽象描述,所以Intent也可稱為一個在不同組件之間傳遞的消息,這個消息在到達接收組件后,接收組件會執(zhí)行相關的動作。2.3Intent信使542.3.1Intent基本構成Intent對象抽象地描述了要執(zhí)行的動作,其描述的基本內容分為六部分:組件名稱(ComponentName)動作(Action)數(shù)據(jù)(Data)類別(Category)附加信息(Extra)標志(Flag)552.3.1Intent基本構成組件名稱ComponentName組件名稱是指Intent目標組件的名稱,組件名稱是一個ComponentName對象,這種對象名稱是目標組件完全限定類名和目標組件所在應用程序的包名的組合。組件名字通過setComponent(),setClass()或setClassName()設置,通過getComponent()讀取。動作Action:Action描述Intent所觸發(fā)動作名字的字符串,對于BroadcastIntent來說,Action指被廣播出去的動作。理論上Action可以為任何字符串,而與Android系統(tǒng)應用有關的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基本構成572.3.1Intent基本構成表1Android系統(tǒng)支持用于Activity組件的常見的動作字符串常量動作說明ACTION_ANSWER打開接聽電話的Activity,默認為Android內置的撥號盤界面ACTION_CALL打開撥號盤界面并撥打電話,使用Uri中的數(shù)字部分作為電話號碼ACTION_DELETE打開一個Activity,對所提供的數(shù)據(jù)進行刪除操作ACTION_DIAL打開內置撥號盤界面,顯示Uri中提供的電話號碼ACTION_EDIT打開一個Activity,對所提供的數(shù)據(jù)進行編輯操作ACTION_INSERT打開一個Activity,在提供數(shù)據(jù)的當前位置插入新項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é)議部分以最佳方式啟動相應的Activity進行處理。對于http:address將打開瀏覽器查看;對于tel:address將打開撥號呼叫指定的電話號碼ACTION_WEB_SEARCH打開一個Activity,對提供的數(shù)據(jù)進行Web搜索582.3.1Intent基本構成表2Android系統(tǒng)支持常見的類別字符串常量值說明ALTERNATIVEIntent數(shù)據(jù)默認動作的一個可替換的執(zhí)行方法SELECTED_ALTERNATIVE和ALTERNATIVE類似,但替換的執(zhí)行方法不是指定的,而是被解析出來的BROWSABLE聲明Activity可以由瀏覽器啟動DEFAULT為Intent過濾器中定義的數(shù)據(jù)提供默認動作HOME設備啟動后顯示的第一個ActivityLAUNCHER在應用程序啟動時首先被顯示59附加信息Extra額外的附加信息,是其它所有附加信息的集合。使用extras可以為組件提供擴展信息,當使用Intent連接不同的組件時,有時需要在Intent中附加額外的信息,以便將數(shù)據(jù)傳遞給目標Activity。Extra用鍵值對結構保存在Intent對象當中,Intent對象通過調用方法putExtras()和getExtras()來存儲和獲取Extra。在Intent類中同樣為Android系統(tǒng)應用的一些Exrta的鍵值定義了靜態(tài)的字符串常量,如下表所示。標記Flag指示Android系統(tǒng)如何去啟動一個Activity和啟動之后的處理。例如,活動應該屬于那個任務,是否屬于最近的活動列表。通常使用setFlags()方法和addFlags()方法設置和添加。2.3.1Intent基本構成60表3Android系統(tǒng)支持常見的Extra字符串常量值說明EXTRA_BCC裝有郵件密送地址的字符串數(shù)組EXTRA_CC裝有郵件抄送地址的字符串數(shù)組EXTRA_EMAIL裝有郵件發(fā)送地址的字符串數(shù)組EXTRA_INTENT使用ACTION_PICK_ACTIVITY動作時裝有Intent選項的鍵EXTRA_KEY_EVENT觸發(fā)該Intent的按鍵的KeyEvent對象EXTRA_PHONE_NUMBER使用撥打電話相關的Action時,電話號碼字符串的鍵,類型為StringEXTRA_SHORTCUT_ICON使用ACTION_CREATE_SHORTCUT在Activity創(chuàng)建快捷方式時,對快捷方式的描述信息。ICON和ICON_RESOURCE描述的是快捷方式的圖標,類型分別為Bitmap和ShortcutIconResource。INTENT描述的是快捷方式相對應的Intent對象。NAME描述的是快捷方式的名字。EXTRA_SHORTCUT_ICON_RESOURCEEXTRA_SHORTCUT_INTENTEXTRA_SHORTCUT_NAMEEXTRA_SUBJECT描述信息主體的鍵EXTRA_TEXT使用ACTION_SEND動作時,用來描述要發(fā)送的文本信息,類型是ChatSequenceEXTRA_TITLE使用ACTION_CHOOSER動作時,描述對話框標題的鍵,類型是ChatSequenceEXTRA_UID使用ACTION_UID_REMOVED動作時,描述刪除用戶Id的鍵,類型為Int612.3.2Intent形式Android系統(tǒng)中有兩種Intent形式,分別為顯式Intent和隱式Intent。顯式Intent(ExplicitIntents)指定了目標組件,一般調用setComponent()或者setClass(Context,Class)設定Intents的component屬性,指定具體的組件類。這些Intent一般不包括包括其它任何信息,通常用于應用程序內部消息,如一個Activity啟動從屬的服務或啟動另一個Activity。隱式Intent(ImplicitIntents)沒有明確指明目標組件,經(jīng)常用于啟動其他應用程序中的組件。622.3.2Intent形式啟動Activity顯式啟動使用Intent顯式啟動Activity創(chuàng)建一個Intent指定當前的應用程序上下文以及要啟動的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行采用了第五種構造函數(shù)形式,指明了主調組件MainActivity和目標組件SecondActivity。startActivity()方法啟動Intent指向的Activity。上面代碼使用了Activity顯示啟動的方式,直接指明了需要啟動的Activity。Intent類定義了六種構造函數(shù)。Intent();Intent(Intento);Intent(Stringaction);Intent(Stringaction,Uriuri);Intent(ContextpackageContext,Class<?>cls);Intent(Stringaction,Uriuri,ContextpackageContext,Class<?>cls);第一種為空構造函數(shù),調用此構造函數(shù)的Intent為一個空Intent對象。第二種的參數(shù)也是一個Intent對象,通過復制該對象初始化新的Intent對象。第三種構造函數(shù)指定了動作Action的類型,第四種構造函數(shù)有兩個參數(shù)分別為指定了動作Action和UriData。第五種構造函數(shù)指定了主調組件和目標組件。第六種構造函數(shù)擁有三個參數(shù),描述了動作Action、數(shù)據(jù)Data和目標組件。67啟動Activity隱式啟動優(yōu)點:不需要指明需要啟動哪一個Activity,而由Android系統(tǒng)來決定,有利于使用第三方組件隱式啟動Activity時,Android系統(tǒng)在應用程序運行時解析Intent,并根據(jù)一定的規(guī)則對Intent和Activity進行匹配,使Intent上的動作、數(shù)據(jù)與Activity完全吻合匹配的Activity可以是應用程序本身的,也可以是Android系統(tǒng)內置的,還可以是第三方應用程序提供的。因此,這種方式更加強調了Android應用程序中組件的可復用性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構造函數(shù)采用的是第四種格式,此代碼的意義就是隱式調用系統(tǒng)內部的Web瀏覽器,打開網(wǎng)址。692.3.3IntentFilterIntent-Filter,即Intent過濾器,是Android系統(tǒng)提供的一種機制,根據(jù)Intent中的動作Action、類別Categorie和數(shù)據(jù)Data等內容,對適合接收該Intent的組件進行匹配和篩選,用于隱式啟動組件過程中。Android應用程序中Activity組件、Service組件和BroadcastReceiver都可以注冊Intent過濾器,可以注冊一個也可以注冊多個。組件注冊Intent過濾器常見的方法是在AndroidManifest.xml文件中用節(jié)點<Intent-Filter>描述。70IntentFilter所支持的屬性2.3.3IntentFilter標簽屬性說明<action>android:name指定組件所能響應的動作,用字符串表示,通常使用Java類名和包的完全限定名構成<category>android:category指定以何種方式去服務Intent請求的動作<data>android:host指定一個有效的主機名android:mimetype指定組件能處理的數(shù)據(jù)類型android:path有效的URI路徑名android:port主機的有效端口號android:scheme所需要的特定的協(xié)議71Android系統(tǒng)中Intent過濾器的匹配規(guī)則可以概括成以下四點:Android系統(tǒng)把所有應用程序包中的Intent過濾器集合在一起,形成一個完整的Intent過濾器列表.在Intent與Intent過濾器進行匹配時,Android系統(tǒng)會將列表中所有Intent過濾器的動作和類別與Intent進行匹配,任何不匹配的Intent過濾器都將被過濾掉。2.3.3IntentFilter72把Intent數(shù)據(jù)Uri的每個子部與Intent過濾器的<data>標簽中的屬性進行匹配,如果<data>標簽指定了協(xié)議、主機名、路徑名或MIME類型,那么這些屬性都要與Intent的Uri數(shù)據(jù)部分進行匹配,任何不匹配的Intent過濾器均被過濾掉。如果Intent過濾器的匹配結果多于一個,則可以根據(jù)在<intent-filter>標簽中定義的優(yōu)先級標簽來對Intent過濾器進行排序,優(yōu)先級最高的Intent過濾器將被選擇。2.3.3IntentFilter732.3.4Activity信息傳遞在開發(fā)Android應用程序過程中,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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 推土機租賃合同參考
- 戰(zhàn)略合作伙伴關系合同
- 2024年有償服務協(xié)議書標準版
- 2024品牌轉讓談判方案
- 版權合作共贏協(xié)議書
- 2024年公司工程裝修合同
- 企業(yè)間采購協(xié)議范本
- 年度寫字樓裝修協(xié)議書范本
- 海外獨家銷售協(xié)議
- 餐飲行業(yè)合伙經(jīng)營合同樣本
- 滬教版七年級上冊數(shù)學復習知識點考點總結歸納提綱
- 2022年醫(yī)院文書檔案保管期限
- 壓力容器焊接工藝
- 托管教師備課系統(tǒng)(課堂PPT)
- 拐杖的使用ppt課件
- 2005年河北高考一分一檔表
- 農(nóng)村污水管網(wǎng)設計說明(共18頁)
- 化工設備機械基礎重點知識點
- 餐飲鋪臺布技能鋪臺布教學課件
- 小學五年級上冊數(shù)學計算題
- 聚乙烯安全技術說明書
評論
0/150
提交評論