如何使用Intent在活動中穿梭

顯式Intent的使用

  • Intent的 Intent(Context packageContext,Class<?> cls),這個函數中,第一個參數Context要求提供一個啓動活動的上下文,第二個參數Class則是指定想要啓動的目標活動。Activity類中提供一個startActivity()方法,專門用來啓動活動
button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivity(intent);
     }
 });

隱式Intent的使用

  • 隱式Intent不明確指出要啓動哪個活動,而是指定了一系列更爲抽象的action和category等信息,由系統分析Intent並幫我們找出合適的活動去啓動。
  • 只有<action>和<category>中的內容同時能匹配上Intent中指定的action和category時,這個活動才能響應這個Intent。
  • 一個Intent中只能指定一個action,而可以指定多個category。可以調用Intent中的addCategory()來添加一個category,添加之後,需要在<intent-filter>標籤中添加一個category的聲明,否則會導致程序的崩潰。

向下一個活動傳遞數據

  • Intent中提供了一系列putExtra()方法的重載,可以把我們想要傳遞數據暫存在Intent中,啓動了另一個活動之後,只需把這些數據再從Intent中拿出來即可。
public void onClcik(View v){
    String data = "Hello SecondActivity";
    Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
    intent.putExtra("extra_data",data);
    startActivity(intent);
}

putExtra()方法中接收兩個參數,第一個是鍵,用於後面從Intent中取值,第二個纔是真正要傳遞的數據。

  • 如上代碼所示,將字符串data存儲在Intent中後,要在SecondActivity中用到時,方法如下所示:
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second_layout);
    Intent intent = getIntent();
    String data = intent.getStringExtra("extra_data");
    Log.d("SecondActivity",data);
 }

首先通過getIntent()方法獲取用於啓動SecondActivity的Intent,然後調用getStringExtra()方法,傳入相應鍵值。

返回數據給上一個活動

  • Activity中還有一個startActivityForResult()方法,期望在活動銷燬時能返回一個結果給上一個活動。這個方法有兩個參數,第一個仍是intent,第二個是請求碼,用於在之後的回調中判斷數據的來源。
button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivityForResult(intent,1);
    }
}

這裏使用startActivityForResult()方法來啓動SecondActivity,請求碼只要是一個唯一值即可。在SecondActivity中給按鈕註冊點擊事件,並在點擊事件添加返回數據的邏輯

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second_layout);    
    Button button2 = (Button) findViewById(R.id.button_2);
    button2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            intent.putExtra("data_return", "Hello FirstActivity");
            setResult(RESULT_OK, intent);
            finish();
        }
    });
}

這裏構建的Intent僅用於傳輸數據。把數據存儲在Intent中後,調用了setResult()方法,專門用於向上一個活動返回數據的。此方法接收兩個參數,第一個用於向上一個活動返回處理結果,一般只使用RESULT_OK或RESULT_CANCELED,第二個則是把帶有數據的Intent傳遞回去,然後用finish()方法銷燬當前活動。

  • 由於我們是使用startActivityForResult()方法來啓動SecondActivity的,活動被銷燬後會回調回上一個活動的onActivityResult()方法,因此我們需要重寫這個方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case 1:
            if (resultCode == RESULT_OK) {
                String returnedData = data.getStringExtra("data_return");
                Log.d("FirstActivity", returnedData);
            }
            break;
        default:
    }
}

onActivityResult()方法中有三個參數,第一個requestCode,即在啓動活動時傳入的請求碼(判斷數據來源的依據)。第二個是resultCode,即在我們返回數據時傳入的處理結果(判讀數據處理是否成功)。第三個是data,即攜帶數據返回的Intent。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章