Intent通常可分為兩種用法,第一種是平時常用來啟動我們程式中的其他Activity;第二種則是用來執行一些特殊動作(如:撥號、開啟網頁、開啟地圖等等),系統會自動匹配對應的Activity。
今天介紹第一種的使用方法,Intent切換Activity的方法其實挺簡單,只需短短兩行程式碼,直接以範例來說明:
1.首先建立一個Activity,以下稱它為TestActivity。
2.於MainActivity加入這兩行程式碼,執行程式即可完成Activity的切換
Intent intent = new Intent(MainActivity.this,TestActivity.class);
startActivity(intent);
必要時,可以加上"finish();"就可以避免使用返回鍵跳回MainActivity的狀況。
Intent intent = new Intent(MainActivity.this,TestActivity.class);
startActivity(intent);
finish();
接下來上一個小範例:
XML布局檔
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="MainActivity"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
app:layout_constraintBottom_toTopOf="@+id/textView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Java程式碼
public class MainActivity extends AppCompatActivity {
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,TestActivity.class);
startActivity(intent);
finish();
}
});
}
}
結果如下:
接下來將介紹如何在切換畫面時,將資料一並傳送過去。在這個地方有兩個較常見的方法。第一種方法是利用Intent自帶的putExtra,可以直接傳送基本的型態;第二種方法透過Bundle物件,將欲傳送的資料放入Bundle,在透過putExtra一次傳送,Bundle還可以傳送除了基本的型態以外的物件。
1.單純使用Intent自帶的putExtra傳送資料
//傳送方
Intent intent = new Intent(MainActivity.this,TestActivity.class);
intent.putExtra("valueStr","testtest");
startActivity(intent);
finish();
//接收方
Intent intent = this.getIntent();
String valueStrResponse = intent.getStringExtra("valueStr");
Log.v("Test",valueStrResponse);
2.使用Bundle,透過putExtra傳送資料
//傳送方
Bundle bundle = new Bundle();
bundle.putInt("valueNum",123123);
bundle.putString("valueStr","testtest");
Intent intent = new Intent(MainActivity.this,TestActivity.class);
intent.putExtras(bundle);
startActivity(intent);
finish();
//接收方
Bundle bundle = this.getIntent().getExtras();
String valueStrResponse = bundle.getString("valueStr");
int valueNumResponse = bundle.getInt("valueNum");
Log.v("Test",valueStrResponse+" "+String.valueOf(valueNumResponse));
3.使用Bundle,透過putExtra傳送基本類型以外的資料
建立一個類別檔UserData
public class UserData implements Serializable{
private String name;
private String age;
private String phone;
public UserData(String name, String age, String phone) {
this.name = name;
this.age = age;
this.phone = phone;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
傳送與接收資料
//傳送方
UserData userData = new UserData("Allan","20","0900000000");
Bundle bundle = new Bundle();
bundle.putSerializable("valueUserData", userData);
Intent intent = new Intent(MainActivity.this,TestActivity.class);
intent.putExtras(bundle);
startActivity(intent);
finish();
//接收方
UserData userDataResponse = (UserData) getIntent().getSerializableExtra("valueUserData");
Log.v("Test","姓名:"+userDataResponse.getName()+" 年齡:"+userDataResponse.getAge()+" 電話:"+userDataResponse.getPhone());
結果如下: