1. 程式人生 > >android Activity(活動)詳解

android Activity(活動)詳解

1.        Android程式的基本組織結構:

1)  src: src目錄是放置我們所有Java程式碼的地方

2)        gen: 自動生成的,主要有R.java,專案中新增的任何資源都會在其中生成一個相應的資源id。(注意不要手動修改)

3)        assets:用的不多,主要存放隨程式打包的檔案,程式在執行的時候可以動態讀取這些檔案內容。

4)        bin:主要包含編譯時產生的檔案,其中有一個編譯好的apk檔案。

5)        libs:主要包含第三方jar包

6)        res:資原始檔夾,專案中使用到的所有圖片、佈局、字串等資源都要存放在這個目錄下,,前面提到的R.java中的內容也是根據這個目錄下的檔案自動生成的。當然這個目錄下還有很多的子目錄,圖片放在drawable目錄下,佈局放在layout目錄下,字串放在values目錄下。

7)        AndroidManifest.xml: 整個Android專案的配置檔案,你在程式中定義的所有四大元件都需要在這個檔案裡註冊。另外還可以在這個檔案中給應用程式新增許可權宣告,也可以重新指定你建立專案時指定的程式最低相容版本和目標版本。

8)        project.properties:通過一行程式碼指定了編譯程式時所使用的SDK版本。

2.        Android日誌工具LogCat: Log.v(); Log.d(); Log.i();Log.w(); Log.e();依次分別為:verbose,debug, information, warning, error。另外,還可以為log工具新增過濾器。

Activity:

1.        如果你需要在XML中引用一個id,就使用@id/id_name這種語法,而如果你需要在XML中定義一個id,則要使用@+id/id_name這種語法。

2.        建立活動的步驟:

1)      新建活動類,繼承自Activity

2)      新增xml佈局檔案

3)      活動註冊:所有活動必須在AndroidManifest.xml中註冊,給主活動指定的label不僅會成為標題欄中的內容,還會成為啟動器(Launcher)中應用程式顯示的名稱。之後在<activity>標籤的內部我們加入了<intent-filter>標籤,並在這個標籤裡添加了<actionandroid:name="android.intent.action.MAIN"/>

<category android:name ="android.intent.category.LAUNCHER" /> 這兩句宣告,這樣這個活動將成為主活動,在點選桌面應用程式的時候首先開啟的就是這個活動。如果程式中沒有宣告任何主活動,程式仍然正常安裝,但是無法再啟動器中看到或者開啟該程式。

3.        隱藏標題欄:requestWindowFeature(Window.FEATURE_NO_TITLE)的意思就是不在活動中顯示標題欄,注意這句程式碼一定要在setContentView()之前執行,不然會報錯

4.        在活動中使用Toast:Android系統提供的一種非常好的提醒方式,在程式中可以使用它將一些短小的資訊通知給使用者,在一段時間後自動消失。findViewById()方法返回的是一個View物件,我們需要向下轉型將它轉成Button物件。

5.        在活動中使用menu:

1)      在res中新增menu資源

2)      在活動中重寫onCreateOptionsMenu()方法

3)      響應選單事件:重寫onOptionsItemSelected()方法

6.        銷燬一個活動:利用Activity中的finish()方法

7.        Intent是android程式中個元件之間進行互動的重要方式,它不僅可以指明當前元件想要執行的動作,還可以在不同元件之間傳遞資料。Intent一般可被用於啟動活動、啟動服務、以及傳送廣播等場景。顯式intent

1)      Intent(Context packageContext, Class<?>cls) 這個建構函式接收兩個引數,第一個引數Context要求提供一個啟動活動的上下文,第二個引數Class則是指定想要啟動的目標活動。

2)      Activity類中提供了一個startActivity()方法,這個方法是專門用於啟動活動的,它接收一個Intent引數

8.      隱式Intent:它並不明確指出我們想要啟動哪一個活動,而是指定了一系列更為抽象的actioncategory等資訊。只有<action><category>中的內容同時能夠匹配上Intent中指定的actioncategory時,這個活動才能響應該Intent,android.intent.category.DEFAULT是一種預設的category,在呼叫startActivity()方法的時候會自動將這個category新增到Intent中。每個Intent中只能指定一個action,但卻能指定多個category,在xml檔案中指定category,並在呼叫的時候新增categpry語句:intent.addCategory("com.example.activitytest.MY_CATEGORY");

9.      使用隱式Intent,我們不僅可以啟動自己程式內的活動,還可以啟動其他程式的活動,這使得Android多個應用程式之間的功能共享成為了可能。Intentintent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com"));setData()接收一個Uri物件,主要用於指定當前Intent正在操作的資料,而這些資料通常都是以字串的形式傳入到Uri.parse()方法中解析產生的。

10.  向下一個活動傳遞資料:在啟動活動時傳遞資料的思路很簡單,Intent中提供了一系列putExtra()方法的過載,可以把我們想要傳遞的資料暫存在Intent中,啟動了另一個活動後,只需要把這些資料再從Intent中取出就可以了。

11.  返回資料給上一個活動:

1)      Activity中還有一個startActivityForResult(intent, 1)方法也是用於啟動活動的,但這個方法期望在活動銷燬的時候能夠返回一個結果給上一個活動。請求碼只要是一個唯一值就可以了,這裡傳入了1。

2)      緊接著把要傳遞的資料存放在Intent中,然後呼叫了setResult()方法,是專門用於向上一個活動返回資料的。setResult()方法接收兩個引數,第一個引數用於向上一個活動返回處理結果,一般只使用RESULT_OKRESULT_CANCELED這兩個值,第二個引數則是把帶有資料的Intent傳遞回去。

3)      使用startActivityForResult()方法來啟動SecondActivity的,在SecondActivity被銷燬之後會回撥上一個活動的onActivityResult()方法,因此我們需要在FirstActivity中重寫這個方法來得到返回的資料。onActivityResult()方法帶有三個引數,第一個引數requestCode,即我們在啟動活動時傳入的請求碼。第二個引數resultCode,即我們在返回資料時傳入的處理結果。第三個引數data,即攜帶著返回資料的Intent。

4)      如果使用者不是通過按鈕來返回activity,而是通過back鍵回到FirstActivity,可以通過重寫onBackPressed()方法來解決這個問題。

12.  活動返回棧:Android是使用任務(Task)來管理活動的,一個任務就是一組存放在棧裡的活動的集合,這個棧也被稱作返回棧(BackStack)。每當我們按下Back鍵或呼叫finish()方法去銷燬一個活動時,處於棧頂的活動會出棧。

13.  活動的狀態:每個活動在生命週期中最多可能會有四種狀態:

1)      執行狀態:當一個活動位於返回棧的棧頂時,活動處於執行狀態

2)      暫停狀態:當一個活動不再處於棧頂位置,但仍然可見時,這時活動就進入了暫停狀態,處於暫停狀態的活動仍然是完全存活著的

3)      停止狀態:當一個活動不再處於棧頂位置,並且完全不可見的時候,就進入了停止狀態。

4)      銷燬狀態:當一個活動從返回棧中移除後就變成了銷燬狀態

14.  活動的生存期:

1)      完整生存期:活動在onCreate()方法和onDestroy()方法之間所經歷的,就是完整生存期

2)      可見生存期:活動在onStart()方法和onStop()方法之間所經歷的,就是可見生存期。在可見生存期內,活動對於使用者總是可見的,即便有可能無法和使用者進行互動

3)      前臺生存期:活動在onResume()方法和onPause()方法之間所經歷的,就是前臺生存期。在前臺生存期內,活動總是處於執行狀態的,此時的活動是可以和使用者進行相互的


15.  返回時活動已被回收:其實還是會正常顯示活動A的,只不過這時並不會執行onRestart()方法,而是會執行活動A的onCreate()方法,因為活動A在這種情況下會被重新建立一次。

1)      Activity中還提供了一個onSaveInstanceState()回撥方法,這個方法會保證一定在活動被回收之前呼叫,因此我們可以通過這個方法來解決活動被回收時臨時資料得不到儲存到的問題。

2)      在onCreate()方法中把Bundle中的資料取出來

16.  Intent還可以結合Bundle一起用於傳遞資料的,首先可以把需要傳遞的資料都儲存在Bundle物件中,然後再將Bundle物件存放在Intent裡。到了目標活動之後先從Intent中取出Bundle,再從Bundle中一一取出資料。

17.  活動的啟動模式(可以在androidManifest.xml中修改android:launchMode="singleTop"):

1)      standard是活動預設的啟動模式,在該模式下,系統不會在乎這個活動是否已經在返回棧中存在,每次啟動都會建立該活動的一個新的例項。它就會在返回棧中入棧,並處於棧頂的位置。

2)      singleTop模式,在啟動活動時如果發現返回棧的棧頂已經是該活動,則認為可以直接使用它,不會再建立新的活動例項。

3)       singleTask模式,每次啟動該活動時系統首先會在返回棧中檢查是否存在該活動的例項,如果發現已經存在則直接使用該例項,並把在這個活動之上的所有活動統統出棧,如果沒有發現就會建立一個新的活動例項。

4)      singleInstance模式,式,指定為singleInstance模式的活動會啟用一個新的返回棧來管理這個活動(其實如果singleTask模式指定了不同的taskAffinity,也會啟動一個新的返回棧)


18.  List是一個介面,而ListArray是一個類ListArray繼承並實現了List。所以List不能被構造,但可以向上面那樣為List建立一個引用,而ListArray就可以被構造。為什麼要用List list = new ArrayList() ,而不用ArrayList alist = new ArrayList()呢?問題就在於List有多個實現類,現在你用的是ArrayList,也許哪一天你需要換成其它的實現類,如LinkedList或者Vector等等。

19.  隨時隨地退出程式:新建一個ActivityCollector類作為活動管理器,在活動管理器中,我們通過一個List來暫存活動,然後提供了一個addActivity()方法用於向List中新增一個活動,提供了一個removeActivity()方法用於從List中移除活動,最後提供了一個finishAll()方法用於將List中儲存的活動全部都銷燬掉。

20.  活動的最佳啟動方法:

1)在SecondActivity中添加了一個actionStart()方法

publicstatic void actionStart(Context context, String data1, String data2) {

Intentintent = new Intent(context, SecondActivity.class);

intent.putExtra("param1",data1);

intent.putExtra("param2",data2);

context.startActivity(intent);

}

2)在FristActivity中:SecondActivity.actionStart(FirstActivity.this,"data1", "data2");

摘至《第一行程式碼》

《瘋狂講義》

詳解Intent與intent-filter

1.      Intent物件大致包含Component, Action, Category,Data, Type, Extra 和Flag七種屬性。其中Component用於明確指定要啟動的目標元件,而Extra用於“攜帶”需要交換的資料。

2.      Data和Type的關係,由於Data和Type屬性通過<data…/>元素進行宣告,而<data…/>的格式如下:<dataandroid:mimType=“”, android:scheme=””…/>,可見Type是Data的子屬性。所以Data屬性和Type屬性的關係比較微妙,這兩個屬性在Intent進行設定時會相互覆蓋,除非使用setDataAndType方法才可以同時設定Data和Type屬性。