最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

第四章 Android生命周期

2018-11-02 13:21 作者:swiss126  | 我要投稿

參考資料:

《Android應(yīng)用程序開發(fā)》ISBN 9787302283164

參考軟件:

Android Studio、Eclipse+ADT、Android SDK、JDK

程序生命周期

Android程序的生命周期是由系統(tǒng)控制而非程序自身直接控制。

Android根據(jù)應(yīng)用程序的組件以及組件當(dāng)前運(yùn)行狀態(tài)將所有的進(jìn)程按重要性程度從高到低劃分了五個(gè)優(yōu)先級(jí):前臺(tái)進(jìn)程、可見進(jìn)程、服務(wù)進(jìn)程、后臺(tái)進(jìn)程、空進(jìn)程

*圖取自網(wǎng)絡(luò),Android應(yīng)用生命周期

  • 前臺(tái)進(jìn)程

前臺(tái)進(jìn)程是顯示在屏幕最前端并與用戶正在交互的進(jìn)程,是Android系統(tǒng)中最重要的進(jìn)程,包含以下四種情況:

  • 進(jìn)程中的Activity正在與用戶進(jìn)行交互

  • 進(jìn)程服務(wù)被Activity調(diào)用,而且這個(gè)Activity正在與用戶進(jìn)行交互

  • 進(jìn)程服務(wù)正在執(zhí)行聲明周期中的回調(diào)方法,如onCreate()、onStart()或onDestroy()

  • 進(jìn)程的BroadcastReceiver正在執(zhí)行onReceive()方法

Android系統(tǒng)在多個(gè)前臺(tái)進(jìn)程同時(shí)運(yùn)行時(shí),可能會(huì)出現(xiàn)資源不足的情況,此時(shí)會(huì)清除部分前臺(tái)進(jìn)程,保證主要的用戶界面能夠及時(shí)響應(yīng)。

  • 可見進(jìn)程

可見進(jìn)程指部分程序界面能夠被用戶看見,卻不在前臺(tái)與用戶交互,不響應(yīng)界面事件(其onPause()方法已被調(diào)用)的進(jìn)程。如果一個(gè)進(jìn)程包含服務(wù),且這個(gè)服務(wù)正在被用戶可見的Activity調(diào)用,此進(jìn)程同樣被視為可見進(jìn)程。

Android系統(tǒng)一般存在少量的可見進(jìn)程,只有在特殊的情況下,Android系統(tǒng)才會(huì)為保證前臺(tái)進(jìn)程的資源而清除可見進(jìn)程。

  • 服務(wù)進(jìn)程

服務(wù)進(jìn)程是指包含由startService()方法啟動(dòng)服務(wù)的進(jìn)程。它有以下特性:沒有用戶界面;在后臺(tái)長(zhǎng)期運(yùn)行。例如,后臺(tái)MP3播放器或后臺(tái)上傳下載數(shù)據(jù)的網(wǎng)絡(luò)服務(wù)。

Android系統(tǒng)除非不能保證前臺(tái)進(jìn)程或可見進(jìn)程所必要的資源,否則不強(qiáng)行清除服務(wù)進(jìn)程

  • 后臺(tái)進(jìn)程

后臺(tái)進(jìn)程是指不包含任何已經(jīng)啟動(dòng)的服務(wù),而且沒有任何用戶可見的Activity的進(jìn)程。這些進(jìn)程不直接影響用戶的體驗(yàn)。

Android系統(tǒng)中一般存在數(shù)量較多的后臺(tái)進(jìn)程,因些這些進(jìn)程會(huì)被保存在一個(gè)列表中,以保證在系統(tǒng)資源緊張時(shí),系統(tǒng)將優(yōu)先清除用戶較長(zhǎng)時(shí)間沒有見到的后臺(tái)進(jìn)程。

  • 空進(jìn)程

空進(jìn)程是不包含任何活躍組件的進(jìn)程。一般保留這些進(jìn)程,是為了將其做為一個(gè)緩存,在它所屬的應(yīng)用的組件下一次需要時(shí),縮短啟動(dòng)的時(shí)間

空進(jìn)程在系統(tǒng)資源緊張時(shí)會(huì)被首先清除,但為了提高Android系統(tǒng)應(yīng)用程序的啟動(dòng)速度,Android系統(tǒng)會(huì)將空進(jìn)程保存在系統(tǒng)內(nèi)存中,在用戶重新啟動(dòng)該程序時(shí),空進(jìn)程會(huì)被重新使用。

Android組件

Android系統(tǒng)有四個(gè)重要的組件,分別是Activity、Service、BroadcaseReceiver和ContentProvider。

Activity是Android程序的呈現(xiàn)層,顯示可視化的用戶界面,并接收與用戶交互所產(chǎn)生的界面事件。在界面上的呈現(xiàn)形式就是全屏窗體、非全屏懸浮窗體的對(duì)話框,與在桌面系統(tǒng)上的獨(dú)立事業(yè),如辦公應(yīng)用等類似。Activities是可執(zhí)行的代碼塊,由用戶或者操作系統(tǒng)來進(jìn)行初始實(shí)例化,并在他們被需求時(shí)致以運(yùn)行。Activities可以與用戶、請(qǐng)求數(shù)據(jù)或者其他activity、service的服務(wù)通過query或intent進(jìn)行交互。大部分為Android編寫的可執(zhí)行代碼將以Activity的形式執(zhí)行。對(duì)于一個(gè)Android應(yīng)用程序來說,可以包含一個(gè)或多個(gè)Activity,一般在程序啟動(dòng)后會(huì)呈現(xiàn)一個(gè)Activity,用于提示用戶程序已經(jīng)正常啟動(dòng)。當(dāng)它不積極運(yùn)行時(shí),Activity可以被操作系統(tǒng)終止以節(jié)省內(nèi)存。

Service用于沒有用戶界面,但需要長(zhǎng)時(shí)間在后臺(tái)運(yùn)行的應(yīng)用。它類似于桌面應(yīng)用或者服務(wù)器操作系統(tǒng)上的服務(wù)或守護(hù)進(jìn)程。Service是在后臺(tái)運(yùn)行的可執(zhí)行的代碼塊,從它被初始化一直運(yùn)行到該程序關(guān)閉。一個(gè)Service的典型的例子是一個(gè)MP3播放器,盡管在用戶已經(jīng)使用其他應(yīng)用程序,但仍然需要持續(xù)播放文件。您的應(yīng)用程序可能需要在沒有用戶界面的情況下一直執(zhí)行Service來實(shí)現(xiàn)后臺(tái)任務(wù)。

Broadcast?and?Intent Receivers對(duì)從其他的應(yīng)用程序的服務(wù)請(qǐng)求做出一個(gè)全系統(tǒng)廣播的響應(yīng),這些廣播響應(yīng)可能來自于Android系統(tǒng)本身或者是任何在其系統(tǒng)上運(yùn)行的程序。BroadcaseReceiver是用來接受并響應(yīng)廣播消息的組件。它不包含任何用戶界面,但可以通過啟動(dòng)Activity或者Notification通知用戶接收到重要信息。

Activity或Service通過執(zhí)行一個(gè)IntentReceiver為其他應(yīng)用程序提供了訪問其功能的功能。Intent Receiver是一段可執(zhí)行代碼塊,對(duì)其他activity的數(shù)據(jù)或服務(wù)請(qǐng)求做出響應(yīng)。請(qǐng)求的activity(即客戶端)生成一個(gè)Intent,把其添加至Android Framework中,來指出哪些應(yīng)用程序(即目標(biāo)程序)接受并對(duì)其做出響應(yīng)。Intent是Android的主要構(gòu)成元素之一,它從現(xiàn)有的應(yīng)用程序中創(chuàng)造新的應(yīng)用程序。Intent實(shí)現(xiàn)了應(yīng)用程序和其他的應(yīng)用程序和服務(wù)交換所需信息的功能。

ContentProvider是Android系統(tǒng)提供的一種標(biāo)準(zhǔn)的共享數(shù)據(jù)的機(jī)制,應(yīng)用程序可以通過ContentProvider訪問其他應(yīng)用程序的私有數(shù)據(jù)(私有數(shù)據(jù)可以是存儲(chǔ)在文件系統(tǒng)中的文件,也可以是SQLite中的數(shù)據(jù)庫)。Android系統(tǒng)內(nèi)部也提供一些內(nèi)置的ContentProvider,能夠?yàn)閼?yīng)用程序提供重要的數(shù)據(jù)信息。

所有Android組件都具有自己的生命周期,是從組件建立到組件銷毀的整個(gè)過程。在生命周期中,組件會(huì)在可見、不可見、活動(dòng)、非活動(dòng)等狀態(tài)中不斷變化。

Activity簡(jiǎn)介

在Android系統(tǒng)中,用戶與程序的交互是通過Activity完成的。Activity是Android應(yīng)用程序的四大組件之一,它負(fù)責(zé)管理Android應(yīng)用程序的界面。一個(gè)應(yīng)用程序一般會(huì)包含若干個(gè)Activity,每一個(gè)Activity組件負(fù)責(zé)一個(gè)界面的展現(xiàn)。

下面列舉幾個(gè)Activity的常用事件,具體如下:?

?????onKeyDown(int keyCode,KeyEvent event):對(duì)應(yīng)按鍵按下事件

?????onKeyUp(int keyCode,KeyEvent event):對(duì)應(yīng)按鍵松開事件

?????onTouchEvent(MotionEvent event):對(duì)應(yīng)點(diǎn)擊屏幕事件

然后在MainActivity中重寫上述方法,運(yùn)行程序進(jìn)行測(cè)試。

示例代碼:Android觸屏控制

package?com.tmsoft.ch31;
?
?import?android.support.v7.app.AppCompatActivity;
?import?android.os.Bundle;
?import?android.view.MotionEvent;
?import?android.widget.Toast;
?
?public class?MainActivity?extends?AppCompatActivity {
?????//手指按下的點(diǎn)為(x1, y1)手指離開屏幕的點(diǎn)為(x2, y2)
?????float?x1?=?0;
?????float?x2?=?0;
?????float?y1?=?0;
?????float?y2?=?0;
?????@Override
?????protected void?onCreate(Bundle savedInstanceState) {
?????????super.onCreate(savedInstanceState);
???????? setContentView(R.layout.activity_main);
???? }
?
?????@Override
?????public boolean?onTouchEvent(MotionEvent event) {
?????????//繼承了Activity的onTouchEvent方法,直接監(jiān)聽點(diǎn)擊事件
?????????if(event.getAction() ?== MotionEvent.ACTION_DOWN) {
?????????????//當(dāng)手指按下的時(shí)候
?????????????x1?= event.getX();
?????????????y1?= ?event.getY();
???????? }
?????????if(event.getAction() ?== MotionEvent.ACTION_UP) {
?????????????//當(dāng)手指離開的時(shí)候
?????????????x2?= event.getX();
?????????????y2?= ?event.getY();
?????????????if(y1?-?y2 ?>?50) {
???????????????? Toast.makeText(MainActivity.this,?"向上滑", Toast.LENGTH_SHORT).show();
???????????? }?else if(y2 ?-?y1?> ?50) {
???????????????? Toast.makeText(MainActivity.this,?"向下滑", Toast.LENGTH_SHORT).show();
???????????? }?else if(x1 ?-?x2?> ?50) {
???????????????? Toast.makeText(MainActivity.this,?"向左滑", Toast.LENGTH_SHORT).show();
???????????? }?else if(x2 ?-?x1?> ?50) {
???????????????? Toast.makeText(MainActivity.this,?"向右滑", Toast.LENGTH_SHORT).show();
???????????? }
???????? }
?????????return super.onTouchEvent(event);
?
???? }
?}
?

Activity生命周期

Activity生命周期指Activity從啟動(dòng)到銷毀的過程。Activity表現(xiàn)為四種狀態(tài),分別是活動(dòng)狀態(tài)、暫停狀態(tài)、停止?fàn)顟B(tài)和非活動(dòng)狀態(tài)。

  • 活動(dòng)狀態(tài),Activity在用戶界面中處于最上層,完全能被用戶看到,能夠與用戶進(jìn)行交互

  • 暫停狀態(tài),Activity在界面上被部分遮擋,該Activity不再處于用戶界面的最上層,且不能夠與用戶進(jìn)行交互;或者屏幕被鎖定。

  • 停止?fàn)顟B(tài),Activity在界面上完全不能被用戶看到,也就是說這個(gè)Activity被其他Activity全部遮擋

  • 非活動(dòng)狀態(tài)不在以上三種狀態(tài)中的Activity則處于非活動(dòng)狀態(tài)

這四種狀態(tài)是可以相互轉(zhuǎn)換的。變換關(guān)系圖如下:

*圖取自網(wǎng)絡(luò),Activity的四種狀態(tài)的變換關(guān)系圖

下面這個(gè)圖解釋了狀態(tài)之間轉(zhuǎn)化的可能路徑。其中著色的橢圓表示活動(dòng)的主要狀態(tài),矩形表示當(dāng)活動(dòng)在狀態(tài)之間轉(zhuǎn)換時(shí)會(huì)被調(diào)用的回調(diào)方法。

*圖取自網(wǎng)絡(luò),Activity活動(dòng)周期

Android調(diào)用以下的事件回調(diào)方法通知activity從某一狀態(tài)轉(zhuǎn)變到另一狀態(tài):

代碼清單:事件的回調(diào)方法

?public class MyActivity extends Activity ?{

???????????protected void ?onCreate(Bundle savedInstanceState);

//Activity啟動(dòng)后第一個(gè)被調(diào)用的方法,常用來進(jìn)行Activity的初始化,例如創(chuàng)建View、綁定數(shù)據(jù)或恢復(fù)信息等。該方法不可終止。

???????????protected void ?onStart();

//當(dāng)Activity顯示在屏幕上時(shí),該方法被調(diào)用。該方法不可終止。


???????????protected void ?onRestart();

//當(dāng)Activity從停止?fàn)顟B(tài)進(jìn)入活動(dòng)狀態(tài)前,調(diào)用該方法。該方法不可終止。


???????????protected void ?onResume();

//當(dāng)Activity能夠與用戶交互,接受用戶輸入時(shí),該方法被調(diào)用。此時(shí)的Activity位于Activity棧的棧頂。該方法不可終止。

?


???????????protected void ?onPause();

//當(dāng)Activity進(jìn)入暫停狀態(tài)時(shí),該方法被調(diào)用。一般用來保存持久的數(shù)據(jù)或釋放占用的資源。該方法可終止。


???????????protected void ?onStop();

//當(dāng)Activity進(jìn)入停止?fàn)顟B(tài)時(shí),該方法被調(diào)用。該方法可終止。


???????????protected void ?onDestroy();

//在Activity被終止前,即進(jìn)入非活動(dòng)狀態(tài)前,該方法被調(diào)用。該方法可終止。

?


?????}

*圖取自網(wǎng)絡(luò)Activity事件回調(diào)方法的調(diào)用順序

*Activity的生命周期可分為全生命周期、可視生命周期和活動(dòng)生命周期。每種生命周期中包含不同的事件回調(diào)方法。

  • 全生命周期

全生命周期是從Activity建立到銷毀的全部過程,始于onCreate(),結(jié)束于onDestroy()。

使用者通常在onCreate()中初始化用戶界面,分配引用類變量,綁定數(shù)據(jù)控件,并創(chuàng)建服務(wù)和線程等Activity所能使用的全局資源和狀態(tài),并在onDestroy()中釋放這些資源,并確保所有外部連接被關(guān)閉,例如網(wǎng)絡(luò)或數(shù)據(jù)庫的聯(lián)系等;在一些極端的情況下,Android系統(tǒng)會(huì)不調(diào)用onDestroy()方法,而直接終止進(jìn)程。

為了避免創(chuàng)造短期對(duì)象和增加垃圾收集的時(shí)間,以致對(duì)用戶體驗(yàn)產(chǎn)生直接影響。如果你的Activity需要?jiǎng)?chuàng)建一些對(duì)象的話,最好在onCreate方法中創(chuàng)建,因?yàn)樗鼉H調(diào)用一次在一個(gè)Actvity的完整生命周期中。

  • 可視生命周期

可視生命周期是Activity在界面上從可見到不可見的過程,開始于onStart(),結(jié)束于onStop()。

  • onStart()一般用來初始化或啟動(dòng)與更新界面相關(guān)的資源

  • onStop()一般用來暫?;蛲V挂磺信c更新用戶界面相關(guān)的線程、計(jì)時(shí)器和服務(wù)

  • onRestart()方法在onSart()前被調(diào)用,用來在Activity從不可見變?yōu)榭梢姷倪^程中,進(jìn)行一些特定的處理過程

  • onStart()和onStop()會(huì)被多次調(diào)用

  • nStart()和onStop()也經(jīng)常被用來注冊(cè)和注銷BroadcastReceiver或者傳感器

在onStart()和onStop()這兩個(gè)方法中間,?Actvity將會(huì)對(duì)用戶是可見的,盡管它可能部分被遮擋著。在一個(gè)Activity完整的生命周期中可能會(huì)經(jīng)過幾個(gè)Activity可見的生命周期,因?yàn)槟愕腁ctivity可能會(huì)經(jīng)常在前臺(tái)和后臺(tái)之間切換。在極端情況下,系統(tǒng)將銷毀掉一個(gè)Activity即使它在可見狀態(tài)并且并不調(diào)用onStop方法。

  • 活動(dòng)生命周期

活動(dòng)生命周期是Activity在屏幕的最上層,并能夠與用戶交互的階段,開始于onResume(),結(jié)束于onPause()。在Activity的狀態(tài)變換過程中onResume()和onPause( )經(jīng)常被調(diào)用,因此這兩個(gè)方法中應(yīng)使用更為簡(jiǎn)單、高效的代碼。

  • onPause()是第一個(gè)被標(biāo)識(shí)為"可終止"的方法

  • 在onPause()返回后,onStop()和onDestroy()隨時(shí)能被Android系統(tǒng)調(diào)用

  • onPause()常用來保存持久數(shù)據(jù),如界面上的用戶的輸入信息等

當(dāng)系統(tǒng)而不是用戶關(guān)閉一個(gè)活動(dòng)來節(jié)省內(nèi)存時(shí),用戶可能希望返回到活動(dòng)且是它之前的狀態(tài)。為了獲得活動(dòng)被殺之前的狀態(tài),你可以執(zhí)行活動(dòng)的onSaveInstanceState()方法。Android在活動(dòng)容易被銷毀前調(diào)用這個(gè)方法,也就是調(diào)用onPause()之前。該方法的參數(shù)是一個(gè)Bundle對(duì)象,在這個(gè)對(duì)象你可以以名值對(duì)記錄活動(dòng)的動(dòng)態(tài)狀態(tài)。當(dāng)活動(dòng)再次啟動(dòng)時(shí),Bundle同時(shí)被傳遞到onCreate()和調(diào)用onCreate()之后的方法onRestoreInstanceState()。

因?yàn)閛nSaveInstanceState()方法不總是會(huì)被調(diào)用,你應(yīng)該僅使用onSaveInstanceState()它來記錄活動(dòng)的臨時(shí)狀態(tài),而不是持久的數(shù)據(jù)。應(yīng)該使用onPause()來存儲(chǔ)持久數(shù)據(jù)。

橫豎屏切換時(shí)的生命周期

1、當(dāng)手機(jī)橫豎屏切換時(shí),Activity會(huì)銷毀重建(模擬器中橫豎屏切換可以使用ctrl+F11)。

2、如果不希望在橫豎屏切換時(shí)Activity被銷毀重建,可以在AndroidManifest.xml文件中設(shè)置Activity的android:configChanges的屬性,具體代碼如下所示:

android:configChanges="orientation|keyboardHidden|screenSize“

3、如果希望某一個(gè)界面一直處于豎屏或者橫屏狀態(tài),可以在清單文件中通過設(shè)置Activity的屬性來完成,具體代碼如下所示:

豎屏:android:screenOrientation="portrait"

橫屏:android:?screenOrientation="landscape"

設(shè)置View的點(diǎn)擊事件監(jiān)聽

Android程序中,設(shè)置View的點(diǎn)擊事件監(jiān)聽共有四種,分別是:

1)在布局文件中為控件設(shè)置onClick屬性指定點(diǎn)擊方法;

2)創(chuàng)建一個(gè)內(nèi)部類實(shí)現(xiàn)OnClickListener接口并重寫onClick()方法,

??????之后需要為控件設(shè)置setOnClickListener(Listener? listener);

3)主類中實(shí)現(xiàn)OnclickListener接口,然后重寫onClick()方法;

4)創(chuàng)建匿名內(nèi)部類,即在為控件設(shè)置監(jiān)聽時(shí)直接創(chuàng)建一個(gè)

??????OnClickListener實(shí)例,不為該實(shí)例指定名稱。

Activity的四種啟動(dòng)模式

一、Android中的任務(wù)棧

Android系統(tǒng)采用任務(wù)棧(Task)的方式來管理Activity的實(shí)例,當(dāng)啟動(dòng)一個(gè)應(yīng)用時(shí),Android就會(huì)為之創(chuàng)建一個(gè)任務(wù)棧。先啟動(dòng)的Activity壓在棧底,后啟動(dòng)的Activity放在棧頂,通過啟動(dòng)模式可以控制Activity在任務(wù)棧中的加載方式。

Android系統(tǒng)中的任務(wù)棧,類似于一個(gè)容器,用于管理所有的Activity實(shí)例。在存放Activity時(shí),滿足“先進(jìn)后出(First-In/Last-Out)”的原則。

?

二、Activity的四種啟動(dòng)模式

Activity的啟動(dòng)模式有四種,分別是standard、singleTop、singleTask和singleInstance。在AndroidManifest.xml中,通過<activity>標(biāo)簽的android:launchMode屬性可以設(shè)置啟動(dòng)模式。

1)?standard標(biāo)準(zhǔn)模式

standard是Activity默認(rèn)的啟動(dòng)模式。在standard模式下,每當(dāng)啟動(dòng)一個(gè)新的Activity,它就會(huì)進(jìn)入任務(wù)棧,并處于棧頂?shù)奈恢茫瑢?duì)于使用standard模式的Activity,系統(tǒng)不會(huì)判斷該Activity在棧中是否存在,每次啟動(dòng)都會(huì)創(chuàng)建一個(gè)新的實(shí)例。

?

2)?singleTop啟動(dòng)模式

singleTop啟動(dòng)模式與standard類似,不同的是,當(dāng)啟動(dòng)的Activity已經(jīng)位于棧頂時(shí),則直接使用它不創(chuàng)建新的實(shí)例。如果啟動(dòng)的Activity沒有位于棧頂時(shí),則創(chuàng)建一個(gè)新的實(shí)例位于棧頂。

3)?singleTask模式

如果希望Activity在整個(gè)應(yīng)用程序中只存在一個(gè)實(shí)例,可以使用singleTask模式,當(dāng)Activity的啟動(dòng)模式指定為singleTask,每次啟動(dòng)該Activity時(shí),系統(tǒng)首先會(huì)檢查棧中是否存在該活動(dòng)的實(shí)例,如果發(fā)現(xiàn)已經(jīng)存在則直接使用該實(shí)例,并將當(dāng)前Activity之上的所有Activity出棧,如果沒有發(fā)現(xiàn)則創(chuàng)建一個(gè)新的實(shí)例。

4)singleInstance模式

在程序開發(fā)中,如果需要Activity在整個(gè)系統(tǒng)中都只有一個(gè)實(shí)例,這時(shí)就需要用到singleInstance模式,不同于上述三種模式,指定為singleInstance模式的Activity會(huì)啟動(dòng)一個(gè)新的任務(wù)棧來管理這個(gè)Activity。

singleInstance模式加載Activity時(shí),無論從哪個(gè)任務(wù)棧中啟動(dòng)該Activity,只會(huì)創(chuàng)建一個(gè)Activity實(shí)例,并且會(huì)使用一個(gè)全新的任務(wù)棧來裝載該Activity實(shí)例。采用這種模式啟動(dòng)Activity會(huì)分為以下兩種情況,具體如下:

第一種:如果要啟動(dòng)的Activity不存在,系統(tǒng)會(huì)先創(chuàng)建一個(gè)新的任務(wù)棧,再創(chuàng)建該Activity的實(shí)例,并把該Activity加入棧頂。

第二種:如果要啟動(dòng)的Activity已經(jīng)存在,無論位于哪個(gè)應(yīng)用程序或者哪個(gè)任務(wù)棧中。系統(tǒng)都會(huì)把該Activity所在的任務(wù)棧轉(zhuǎn)到前臺(tái),從而使該Activity顯示出來。

多窗口切換例子:

在該例中涉及到Fx_Main、Activity2以及Activity3三個(gè)Activity。

首先,介紹一下例子中涉及到的三個(gè)Activity及其界面:

首先是Fx_Main.Activity:

?Fx_Main的界面

由上圖所示的界面中,點(diǎn)擊"跳轉(zhuǎn)到AC2"按鈕之后,跳轉(zhuǎn)至Activity2。具體代碼如下:

代碼清單4-3. Fx_Main.Activity

?

?

import android.app.Activity;
?????import android.content.Intent;
?????import android.os.Bundle;
?????import android.util.Log;
?????import android.view.View;
?????import android.view.View.OnClickListener;
?????import android.widget.Button;
?????import android.widget.TextView;
?
?????public class Fx_Main extends Activity {
???????/** Called when the activity is first ?created. */
???????private Button b;
???????@Override
???????protected void onCreate(Bundle ?savedInstanceState) {
?????????// TODO Auto-generated method ?stub
?????????super.onCreate(savedInstanceState);
?????????setContentView(R.layout.main);
?????????TextView ?tv=(TextView)findViewById(R.id.TextView01);
?????????tv.setText("Main---->"+getTaskId());
?????????Log.i("System.out", ?"Main---->"+this.toString()+"Task ?ID---->"+getTaskId());
?????????b=(Button)findViewById(R.id.Button01);
?????????b.setOnClickListener(new ?OnClickListener(){
?
???????????@Override
???????????public void ?onClick(View v) {
?????????????// ?TODO Auto-generated method stub
?????????????Intent ?i=new Intent(Fx_Main.this,Activity2.class);
?????????????startActivity(i);
?????????}});
???????}
???????@Override
???????protected void onDestroy() {
?????????// TODO Auto-generated method ?stub
?????????super.onDestroy();
?????????Log.i("System.out", ?"Fx_Main--->Destory");
???????}
?????}

?

其次為Activity2,其界面如下:

Activity2的界面

在該界面中,點(diǎn)擊"跳回到Main"按鈕,則跳轉(zhuǎn)至Fx_Main,而點(diǎn)擊"跳轉(zhuǎn)本頁面"則仍顯示Activity2的界面,點(diǎn)擊"跳到AC3"則跳轉(zhuǎn)到Activity3.具體代碼如下:

代碼清單4-4. Activity2.Activity

?

?

import android.app.Activity;
?????import android.content.Intent;
?????import android.os.Bundle;
?????import android.util.Log;
?????import android.view.View;
?????import android.view.View.OnClickListener;
?????import android.widget.Button;
?????import android.widget.TextView;
?
?????public class Activity2 extends Activity {
???????private Button b;
???????private Button b2;
???????private Button b3;
???????@Override
???????protected void onCreate(Bundle ?savedInstanceState) {
?????????// TODO Auto-generated method ?stub
?????????super.onCreate(savedInstanceState);
?????????setContentView(R.layout.activity2);
?????????b=(Button)findViewById(R.id.Button02);
?????????b2=(Button)findViewById(R.id.Button03);
?????????b3=(Button)findViewById(R.id.Button04);
?????????TextView ?tv=(TextView)findViewById(R.id.TextView02);
?????????tv.setText("Ac2---->"+getTaskId());
?????????Log.i("System.out", ?"Ac2---->"+this.toString()+"Task ?ID---->"+getTaskId());
?????????b.setOnClickListener(new ?OnClickListener(){
?
???????????@Override
???????????public void ?onClick(View v) {
?????????????// ?TODO Auto-generated method stub
?????????????Intent ?i=new Intent(Activity2.this,Fx_Main.class);
?????????????startActivity(i);
?????????}});
?????????b2.setOnClickListener(new ?OnClickListener(){
?
???????????@Override
???????????public void ?onClick(View v) {
?????????????// ?TODO Auto-generated method stub
?????????????Intent ?i=new Intent(Activity2.this,Activity2.class);
?????????????startActivity(i);
?????????}});
?????????b3.setOnClickListener(new ?OnClickListener(){
?
???????????@Override
???????????public void ?onClick(View v) {
?????????????// ?TODO Auto-generated method stub
?????????????Intent ?i=new Intent(Activity2.this,Activity3.class);
?????????????startActivity(i);
?????????}});
???????}
???????@Override
???????protected void onDestroy() {
?????????// TODO Auto-generated method ?stub
?????????super.onDestroy();
?????????Log.i("System.out", ?"Ac2--->destory");
???????}
?????}

?

最后是Activity3,其界面如下:

Activity3的界面

如上圖所示,點(diǎn)擊"返回Main"則跳轉(zhuǎn)至Fx_Main,點(diǎn)擊"返回AC2"則跳轉(zhuǎn)到Activity2.具體代碼如下:

代碼清單4-5. Activity3.Activity

?

?

import android.app.Activity;
?????import android.content.Intent;
?????import android.os.Bundle;
?????import android.util.Log;
?????import android.view.View;
?????import android.view.View.OnClickListener;
?????import android.widget.Button;
?????import android.widget.TextView;
?
?????public class Activity3 extends Activity {
???????private Button b;
???????private Button b2;
???????@Override
???????protected void onCreate(Bundle ?savedInstanceState) {
?????????// TODO Auto-generated method ?stub
?????????super.onCreate(savedInstanceState);
?????????setContentView(R.layout.activity3);
?????????b=(Button)findViewById(R.id.Button03);
?????????b2=(Button)findViewById(R.id.Button04);
?????????TextView ?tv=(TextView)findViewById(R.id.TextView03);
?????????tv.setText("Ac3---->"+getTaskId());
?????????Log.i("System.out", ?"Ac3---->"+this.toString()+"Task ?ID---->"+getTaskId());
?????????b.setOnClickListener(new ?OnClickListener(){
?
???????????@Override
???????????public void ?onClick(View v) {
?????????????// ?TODO Auto-generated method stub
?????????????Intent ?i=new Intent(Activity3.this,Fx_Main.class);
?????????????startActivity(i);
?????????}});
?????????b2.setOnClickListener(new ?OnClickListener(){
?
???????????@Override
???????????public void ?onClick(View v) {
?????????????// ?TODO Auto-generated method stub
?????????????Intent ?i=new Intent(Activity3.this,Activity2.class);
?????????????startActivity(i);
?????????}});
???????}
???????@Override
???????protected void onDestroy() {
?????????// TODO Auto-generated method ?stub
?????????super.onDestroy();
?????????Log.i("System.out", ?"Ac3--->Destory");
???????}
?????}

窗體間數(shù)據(jù)傳遞

第一個(gè)窗體?

com.tmsoft.ch42;android.content.Intent;android.support.v7.app.AppCompatActivity;android.os.Bundle;android.view.View;android.widget.EditText;android.widget.TextView;MainActivity?AppCompatActivity?{????EditText?;????TextView?;????onCreate(Bundle?savedInstanceState)?{????????.onCreate(savedInstanceState);????????setContentView(R.layout.);????????=?(EditText)?.findViewById(R.id.);????????=?(TextView)?.findViewById(R.id.);????}????toSec(View?view){????????Intent?intent?=?Intent(,Main2Activity.);????????intent.putExtra(,.getText().toString().trim());????????.startActivityForResult(intent,);????}????onActivityResult(requestCode,?resultCode,?Intent?data)?{????????.setText(data.getStringExtra().toString());????????}????}????????????????<?xml?version="1.0"?encoding="utf-8"?><RelativeLayout?xmlns:android="http://schemas.android.com/apk/res/android"????xmlns:tools="http://schemas.android.com/tools"????android:id="@+id/activity_main"????android:layout_width="match_parent"????android:layout_height="match_parent"????android:paddingBottom="@dimen/activity_vertical_margin"????android:paddingLeft="@dimen/activity_horizontal_margin"????android:paddingRight="@dimen/activity_horizontal_margin"????android:paddingTop="@dimen/activity_vertical_margin"????tools:context="com.tmsoft.ch42.MainActivity">????<TextView????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:text="Hello?World!"????????android:id="@+id/tv3"?/>????<EditText????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:inputType="textPersonName"????????android:text="Name"????????android:ems="10"????????android:layout_below="@+id/textView"????????android:layout_alignParentStart="true"????????android:layout_marginStart="42dp"????????android:layout_marginTop="72dp"????????android:id="@+id/editText"?/>????<Button????????android:text="打開第二窗體并傳遞數(shù)據(jù)"????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:layout_below="@+id/editText"????????android:layout_toEndOf="@+id/textView"????????android:layout_marginStart="30dp"????????android:layout_marginTop="63dp"????????android:onClick="toSec"????????android:id="@+id/button"?/></RelativeLayout>

第二個(gè)窗體

com.tmsoft.ch42;android.content.Intent;android.support.v7.app.AppCompatActivity;android.os.Bundle;android.view.View;android.widget.EditText;android.widget.TextView;Main2Activity?AppCompatActivity?{????TextView?;????EditText?;????onCreate(Bundle?savedInstanceState)?{????????.onCreate(savedInstanceState);????????setContentView(R.layout.);????????=?(TextView)?.findViewById(R.id.);????????Intent?intent?=?.getIntent();????????.setText(intent.getStringExtra().toString());????????=?(EditText)?.findViewById(R.id.);????}????toFirst(View?view){????????Intent?intent?=?Intent(,MainActivity.);????????intent.putExtra(,.getText().toString()+.getText().toString());????????.setResult(,intent);????????.finish();????????}}

重點(diǎn):

1、Android程序的生命周期是由系統(tǒng)控制而非程序自身直接控制。

Android應(yīng)用程序五個(gè)優(yōu)先級(jí):前臺(tái)進(jìn)程、可見進(jìn)程、服務(wù)進(jìn)程、后臺(tái)進(jìn)程、空進(jìn)程。

2、Android四大組件:Activity、Service、BroadcaseReceiver和ContentProvider。

3、Activity常用事件:?

?????onKeyDown(int keyCode,KeyEvent event):對(duì)應(yīng)按鍵按下事件

?????onKeyUp(int keyCode,KeyEvent event):對(duì)應(yīng)按鍵松開事件

?????onTouchEvent(MotionEvent event):對(duì)應(yīng)點(diǎn)擊屏幕事件

4、Activity生命周期

Activity表現(xiàn)為四種狀態(tài),分別是活動(dòng)狀態(tài)、暫停狀態(tài)、停止?fàn)顟B(tài)和非活動(dòng)狀態(tài)。

5、Activity的四種啟動(dòng)模式

Activity的啟動(dòng)模式有四種,分別是standard、singleTop、singleTask和singleInstance

6、橫豎屏切換時(shí)的生命周期

不希望在橫豎屏切換時(shí)Activity被銷毀重建:

android:configChanges="orientation|keyboardHidden|screenSize“

一直處于豎屏或者橫屏狀態(tài):

豎屏:android:screenOrientation="portrait"

橫屏:android:?screenOrientation="landscape"


第四章 Android生命周期的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
绥棱县| 莱芜市| 兰西县| 体育| 栖霞市| 五寨县| 凭祥市| 凉城县| 洱源县| 乌拉特前旗| 凉山| 武定县| 伊金霍洛旗| 贡嘎县| 东至县| 惠来县| 亚东县| 石景山区| 镇康县| 西乌| 聊城市| 黄梅县| 凤山县| 乡城县| 祥云县| 甘谷县| 肇东市| 怀远县| 彰化市| 仙居县| 太湖县| 沈阳市| 河西区| 桃江县| 原阳县| 黄山市| 修文县| 汨罗市| 仙居县| 重庆市| 德兴市|