Android Activity(二)

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);
    
  • 第二種方式:(直接撥打)
    intent.setAction("android.intent.action.CALL");
    intent.setData(Uri.parse("tel:" + phoneNumber));
    startActivity(intent);
    
    其實這就是一種Activity跳轉方式,在當前Activity去調用系統自帶的撥號程序中的撥號Activity,至於兩種方式的不同,這個具體在下面會講到。
    事實上,我所說的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來實現的,它一般用在沒有明確指出目標組件名稱的前提下,一般是用於在不同應用程序之間。
    Intent intent = new Intent();
    intent.setAction("activity.second");
    MainActivity.this.startActivity(intent);
    
    AndroidMnifest.xml部分內容如下:
    <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
    
    要接受返回的值需要複寫方法:
    protected void onActivityResult(int requestCode, int resultCode, Intent data){}
    
    方法中對code值進行判斷並獲取intent中bundle的鍵值。
  • 第二個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");//讀出數據
發佈了45 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章