1. 最近在自學Android,也是邊看書邊寫一些Demo,由於知識點越來越多,腦子越來越記不清楚,所以打算寫成讀書筆記,供以后查看,也算是把自己學到所理解的東西寫出來,獻丑,如有不對的地方,希望大家給與指正。
2. 由於類似於讀書筆記,可能格式神馬的會比較隨(hen)意(chou),大家看着受不了,可以使勁吐槽。
*************************************我只是分割線***************************************
上一篇已經講了一些關於Project目錄結構的東西,這次記錄一下關於Android四大組件之一的Activity的一些東西,它也是Android中最基本的模塊之一。
<一>什么是Activity?
它叫活動(聽着很別扭,這么長時間還是感覺不好接受~),幾乎所有的活動都是用來與用戶交互的,活動主要關注與視圖窗體的創建,一個應用程序可以包含零個或者多個活動,但是包含零個活動的應用比較少。【PS:這話是參考別人的,我只是拿來裝X】
其實通俗來說,我們可以把手機當做一個瀏覽器,而Activity就是其中的一個個網頁,在Activity上面,我們可以添加不同的View(就是.NET里面所說的控件),並且可以執行一些操作邏輯。
<二>Activity的生命周期
如圖【圖片是借用別人的】,
Activity的“整個生命周期”是發生在第一次調用onCreate(Bundle)和唯一最后調用onDestroy()方法之間。在onCreate(Bundle)方法中完成活動的初始化操作設置全局狀態,比如加載布局、綁定事件等,並在onDestroy()方法釋放資源。
Activity的“顯示生命周期”是發生在調用onStart()方法以及調用相對應的onStop()方法之間。在這之間,可以在手機屏幕上看到這個活動。隨着Activity對用戶的可見和不可見狀態的改變,這兩個方法能被多次調用。
Activity的“前台生命周期”是在onResume()和onPause()方法之間所經歷的,在這個周期內,活動處於運行狀態,此時的活動是可以和用戶進行交互的。
我個人的方法是:創建一個app,然后在Activity的代碼中把這些方法全部重寫出來,為每個方法打上斷點(或者日志輸出),Debug進行調試,就基本上明白了什么時候會被調用。
<三>Activity的啟動和Activity之間的數據傳遞
這里我們需要用到一個對象Intent,Intent是Android程序中各組件之間進行交互的一種重要方式,它一般可被用於啟動活動、啟動服務、以及發送廣播等場景,關於它的用法后面再詳細說。
1. 簡單的啟動新的Activity
使用的方法:startActivity(Intent)
示例:
Intent _intent = new Intent(); _intent.setClass(MainActivity.this, ActivityB.class); startActivity(_intent);
//這個調用方法也可以寫成
Intent _intent2 = new Intent(MainActivity.this,ActivityB.class);
startActivity(_intent2);
實例化一個Intent對象,然后指定從當前的MainActivity這個活動,跳轉到ActivityB這個活動。
2. 啟動新的Activity,並有返回值
使用方法:public void startActivityForResult(Intent intent, int requestCode),注意第二個參數:requesCode,這個參數類似於當初特工接頭時的暗號,
示例:
1. 應用從活動MainActivity跳轉到ActivityC,並請求一個字符串;
2. 在活動Activity中操作,關閉活動ActivityC時,返回請求的字符串給MainActivty;
3.活動MainActivity獲取字符串。
class ButtonActivitiesClickListener implements OnClickListener { @Override public void onClick(View v) { if (v.getId() == R.id.btnSkipToC) { Intent _intent = new Intent(); _intent.setClass(MainActivity.this, ActivityC.class); startActivityForResult(_intent, 100); } } }
注意,這里就是啟動新的活動ActivityC,暗號requestCode是100。
在活動ActivityC中,點擊關閉按鈕時用void setResult (int resultCode, Intent data)傳回請求的字符串,
class ButtonActivityAListener implements OnClickListener { @Override public void onClick(View v) { if (v.getId() == R.id.btnreturn) { Intent _intent = new Intent(); EditText editText = (EditText) findViewById(R.id.edittext_first); String inputStr = editText.getText().toString(); _intent.putExtra("dashenzaijia", inputStr); setResult(Activity.RESULT_OK, _intent); finish(); } } }
備注:Intent.putExtra(String name, String value)類似於一個數據字典,這個Intent就是ActivityC返回字符串給MainActivity的載體,name就是鍵,finish()方法類似於winform中的Close();
關閉活動ActivityC后,然后再MainActivity中,有一個虛方法,重載一下,然后從這個方法里面獲取ActivityC的返回值,如下:
@Override protected void onActivityResult(int arg0, int arg1, Intent arg2) { // TODO Auto-generated method stub super.onActivityResult(arg0, arg1, arg2); if (arg0 == 100 && arg1 == Activity.RESULT_OK) { String returnValue = arg2.getStringExtra("dashenzaijia"); TextView view = (TextView) this.findViewById(R.id.textview_showresult); if (!returnValue.isEmpty()) { view.setText("來自Activity C的值:" + returnValue); } else { view.setText(null); } } }
第一個參數就是當初定義的兩個活動之間的暗號,第二個參數是跳轉后頁面的關閉時的結果,類似於C# 里面窗體關閉時的DialogResult,第三個參數就是返回值的載體。
<四>活動的啟動模式
啟動模式有四種,分別是:standard、singleTop、singleTask、singleInstance,可以在AndroidManifest.xml文件中通過給<Activity>標簽指定android:launchMode屬性來選擇啟動模式。
1. standard
standard是活動默認的啟動模式,在不進行顯示指定的情況下,所有活動都會自動使用這種啟動模式。Android是使用返回棧來管理活動的,在standard模式下,每當啟動一個新的活動,它就會在返回棧中入棧,並處理棧頂的位置。對於使用standard模式的活動,系統不會在乎這個活動是否已經在返回棧中存在,每次啟動都會創建該活動的一個新的實例。
例如:應用啟動顯示的活動是A,A中啟動了B,B中啟動了C,活動A、B、C的啟動模式都是standard模式的,這時候你如果想退出這個應用,需要點擊三次Back鍵才可以。
同樣的,如果我們在活動A中,點擊按鈕Button啟動了活動A,然后再點擊按鈕Button,又啟動了A,這時候返回棧中有三個活動A,需要點擊三次Back鍵才能退出應用。
2. singleTop
使用singleTop模式時,在啟動活動的時候,如果返現返回棧的棧頂已經是該活動,則認為可以直接使用,不會再創建新的該活動的實例。
例如,系統默認啟動了活動A,在活動A中,點擊按鈕Button啟動了活動A,然后再點擊按鈕Button,又啟動了A,這時候返回棧中其實仍舊只有一個活動A,我們只需要點擊一次Back鍵就能退出應用,活動A是singleTop模式的。
同樣的,應用中有A、B兩個活動,它們的啟動模式都是singleTop,應用啟動A,然后A啟動了B,B又啟動了A活動,這時候返回棧中其實有兩個A,一個B,我們需要點擊三次Back鍵才能退出應用。
3. singleTask
使用singleTask模式時,每次啟動活動的時候,系統首先會在返回棧中檢查是否存在該活動的實例,如果發現已經存在該活動的實例,直接使用該實例,並把這個活動之上的所有活動統統出棧,如果沒有發現就會創建一個新的活動實例。
例如,應用默認啟動了活動A,活動A是singleTask模式的,然后A啟動了B,B啟動了C,C又啟動了A,這時候返回棧中其實只有一個A,B、C都已經被出棧,只需要點擊一次Back鍵就可以退出應用。
4. singleInstance
使用singleInstance模式的活動,會有一個單獨的返回棧來管理這個活動,一般來說,這種模式是可以用來實現其他應用程序和我們的程序可以共享這個活動的實例的,不管是哪個應用程序來訪問這個活動,都共用的同一個返回棧。
例如,應用默認啟動了活動A,A啟動了活動B,活動B是singleInstance模式的,然后活動B啟動了C,我們點擊Back鍵,會從C跳轉到活動A,因為A和C在一個返回棧,而B是另一個返回棧,在點擊Back鍵,A跳到了B,再點擊Back鍵,退出程序。
關於Activity的最基本的一些知識就說完了。