天天看點

Activity的跳轉和資料傳遞

顯示跳轉和隐式跳轉

  • 顯示跳轉
public void onClick(View view) {
                //Intent intent = new Intent();
                //顯式1
                //intent.setClass(AActivity.this,BActivity.class);
                //顯式2
                //intent.setClassName(AActivity.this,"com.example.test.jump.BActivity");
                //顯式3
                //intent.setComponent(new ComponentName(AActivity.this,"com.example.test.jump.BActivity"));
                //顯式4,最常用
                Intent intent = new Intent(AActivity.this,BActivity.class);
                startActivity(intent);
                
            }
           
  • 隐式跳轉
  1. 在activity.java中如下設定,記住setAction中的字元串
Intent intent = new Intent()
intent.setAction("com.b.jump");
startActivity(intent);
           
  1. 在AndroidManifest檔案中要跳轉到的目标activity标簽中添加如下子标簽,action中的name屬性值就是之前setAction中寫的那個。category的name值也要做如下修改
<intent-filter>
     <action android:name="com.b.jump" />
     <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
           
intent.setAction還可以調用一些系統的元件,比如打電話,發郵件,攝像頭等等

activity之間的資料傳遞

  • 資料的綁定:Bundle類

    通過put對應的方法綁定資料,資料是鍵值對的形式綁定的,綁定的資料可以是各種類型string/int/數組等等,比如

    void putString( String key,String value);

    void putInt( String key, int value) ;

  • bundle設定到intent
    1. intent.putExtra(key,value): 給bundle綁定一個key,鍵值對的形式放進去,相應的讀取時就用intent.getExtra(key)
    2. inten.putExtras(bundle):這樣可以直接放bundle進去,讀取的時候就用intent.getExtras()方法
//綁定資料
                Bundle bundle = new Bundle();
                bundle.putString("name","德華");
                bundle.putInt("age",18);
                //将bundle放進intent中
                intent.putExtras(bundle);
                startActivity(intent);
           
  • 資料的讀取

    讀取的方法根據綁定的時候用的方法來

Button btnB = findViewById(R.id.btn_b);
        //擷取intent
        Intent intent = getIntent();
        //擷取bundle
        Bundle bundle = intent.getExtras();
        //擷取綁定資料
        String name = bundle.getString("name");
        int age = bundle.getInt("age");
           

startActivityForResult:啟動Activity,結束後傳回結果

前面的是跳轉時綁定資料,而這裡是按傳回鍵時綁定資料到另一個頁面,不同的需求。

  • startActivityForResult(Intent, int)

    第一個參數Intent,和普通的startActivity()裡的Intent一樣,裡面放要請求的Activity和可能需要放的資料。

    第二個參數int,是一個請求代碼,整型的,這個可以自己随便定義,但這個數要大于等于0才行。因為MainActivity有可能會跳轉到多個頁面,如果這幾個頁面使用完之後,都需要傳回一些資訊,那麼就必須要有個辨別符來表示傳回來過的是哪個頁面的資訊。

  • setResult(int),setResult(int, Intent)

    第一個參數int,是一個傳回代碼,整型的,這個也是自己随便定義,用來表示這個頁面執行之後是個什麼情況,是成功還是失敗了,還是其它什麼的,反正傳回一個整型數,自己知道它的含義就行了。這個資料在Activity類中有常量可以用。

    第二個可選參數是一個Intent,可以用來存放資料。

  • void onActivityResult(int requestCode, int resultCode, Intent data)

    這個方法是請求的Activity完成任務被finish()之後,會調用這個,前提是,你啟動那個Activity是通過startActivityForResult()來啟動的。

    第一個參數int,是請求代碼,就是startActivityForResult()裡面的請求代碼。

    第二個參數int,是傳回代碼,就是setResult()方法裡面的設定的參數。

    第三個參數Intent,就是setResult(int, Intent)裡面的放置資料的Intent。

案例

  • AActivity初始頁面:
package com.example.test.jump;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.test.R;
import com.example.test.util.ToastUtil;

public class AActivity extends AppCompatActivity {
    private Button btnA;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);
        btnA = findViewById(R.id.btn_a);
        btnA.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Intent intent = new Intent();
                //顯式1
                //intent.setClass(AActivity.this,BActivity.class);
                //顯式2
                //intent.setClassName(AActivity.this,"com.example.test.jump.BActivity");
                //顯式3
                //intent.setComponent(new ComponentName(AActivity.this,"com.example.test.jump.BActivity"));
                //顯式4,最常用
//                Intent intent = new Intent(AActivity.this,BActivity.class);
                 //隐式跳轉,需要在AndroidManifest檔案中配置
                Intent intent = new Intent();
                intent.setAction("com.b.jump");
                //綁定資料
                Bundle bundle = new Bundle();
                bundle.putString("name","德華");
                bundle.putInt("age",18);
                //将bundle放進intent中
                intent.putExtras(bundle);
                // startActivity(intent);
                //另一種跳轉方式,附帶請求碼,等轉發過去的頁面finish的時候綁定的資料也會帶着這個碼,就知道資料是要傳給這個頁面的
                startActivityForResult(intent,0);

            }
        });
    }
/**
     * 當跳轉到的頁面finish時就會觸發這個方法,在裡面可以得到傳過來的資料
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        ToastUtil.showMsg(AActivity.this,data.getExtras().getString("B"));
    }
}

           
  • BActivity:跳轉到的頁面
package com.example.test.jump;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.test.R;
import com.example.test.util.ToastUtil;

public class BActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R. layout.activity_b);
        Button btnB = findViewById(R.id.btn_b);
        //擷取intent
        Intent intent = getIntent();
        //擷取bundle
        Bundle bundle = intent.getExtras();
        //擷取綁定資料
        String name = bundle.getString("name");
        int age = bundle.getInt("age");
        ToastUtil.showMsg(BActivity.this,"A中綁定的資料:"+name+":"+age);

        btnB.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                Bundle bundle1 = new Bundle();
                bundle1.putString("B","B中綁定的資料");
                intent.putExtras(bundle1);
                setResult(Activity.RESULT_OK,intent);
                //finish用于結束Activity的生命周期,會調用onDestroy方法.其結果和使用者按下傳回鍵是一樣的
                finish();
            }
        });
    }

}