Android Activity(二)
二、Intent
題外話:爲什麼我會將打電話、發短信、拍照等視作系統功能操作(事實上Android官方也是這麼理解的),可能很多人認爲在Android操作系統中,這些只是一個個的程序,跟QQ沒什麼區別。但是這些功能畢竟是從功能機時代開始,作爲一部手機所具有的基本功能。舉個例子,你的手機裏可能沒有自帶QQ、支付寶等程序,但是絕對自帶了撥號程序、短信、相機等程序。另外,我們可以從網上形形色色的Android應用上看出,撥號、短信、相機等應用只佔了極其少數。當然,也有在同一個系統中存在多個相同的系統功能程序,比如你在某條短信中要打開某個URL,假如你裝了Chrome瀏覽器和系統自帶瀏覽器,當你點擊該URL後,系統會根據你的點擊事件尋找到符合Action功能要求的程序Activity,並彈出對話框讓你選擇使用哪一個瀏覽器進行瀏覽。
1. Intent,意圖,對一次操作的抽象描述。
我個人將其理解爲:一個Activity要與其他Activity進行互動,需要使用Intent作爲媒介才能相互通信(好比兩個人對話之間需要空氣作爲媒介傳遞聲音一樣,當然你可以用棉線::>_<::),所以Intent就是將Activity要進行的具體、具象化的操作抽象成相應的數據進行傳遞。
2. Activity使用Intent進行系統功能操作,如打電話,發郵件、短信等,記得加上權限!
- 第一種方式:(Android官方推薦,僅去到撥號界面,類似於)
intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + phoneNumber)); startActivity(intent);
- 第二種方式:(直接撥打)
其實這就是一種Activity跳轉方式,在當前Activity去調用系統自帶的撥號程序中的撥號Activity,至於兩種方式的不同,這個具體在下面會講到。intent.setAction("android.intent.action.CALL"); intent.setData(Uri.parse("tel:" + phoneNumber)); startActivity(intent);
事實上,我所說的Activity使用Intent去調用系統功能操作,說白了就是通過Intent跳轉到相應程序的Activity,中間還傳遞了相應的參數。
3. 使用Intent啓動新的Activity
分爲兩種方式:顯式Intent和隱式Intent
- 顯式Intent:通過指定Intent組件名稱來實現的,它一般用在知道目標組件名稱的前提下,一般是在相同的應用程序內部實現的。
Intent intent = new Intent(MainActivity.this, SecondActivity.class); MainActivity.this.startActivity(intent);
- 隱式Intent:通過Intent Filter來實現的,它一般用在沒有明確指出目標組件名稱的前提下,一般是用於在不同應用程序之間。
AndroidMnifest.xml部分內容如下:Intent intent = new Intent(); intent.setAction("activity.second"); MainActivity.this.startActivity(intent);
<activity android:name="com.example.activity.SecondActivity" android:label="@string/app_name" > <intent-filter> <action android:name="activity.second" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
4. 使用Intent在Activity間傳值
- 第一個Activity,傳值端:
Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("str", "傳過去的值");//(name, value) MainActivity.this.startActivity(intent);
- 第二個Activity,接收端:
Intent intent = getIntent( ); Bundle bundle = intent.getExtras(); String str = bundle.getString("str");
5. 使用Intent在Activity之間返回值
- 第一個Activity,接收端:
要接受返回的值需要複寫方法:private final static int REQUEST_CODE = 1;//識別碼 startActivityForResult(intent, REQUEST_CODE);//跳轉Activity
方法中對code值進行判斷並獲取intent中bundle的鍵值。protected void onActivityResult(int requestCode, int resultCode, Intent data){}
- 第二個Activity,傳值端:
Intent intent = new Intent(); intent.putExtra("back", "第二個Activity返回的值"); setResult(RESULT_CODE, intent); finish();//該方法結束當前Activity並返回調用它的Activity
6. Bundle 捆綁
Bundle類爲Key-Value形式的鍵值對
Activity間的數據通訊可通過Bundle類實現(必須藉助Intent類)
- 第一個Activity:傳值端:
Intent intent = new Intent(); intent.setClass(MainActivity.this, SecondActivity.class); Bundle mBundle = new Bundle(); mBundle.putString("Data", "data from MainActivity");//壓入數據 intent.putExtras(mBundle); startActivity(intent);
- 第二個Activity:接收端:
Bundle bundle = getIntent().getExtras();//得到傳過來的bundle String data = bundle.getString("Data");//讀出數據