iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0

今天來介紹Intent,ok我們直接開始:))

什麼是Intent .w.?

在 Android 開發中,它扮演著不同元件之間溝通橋樑的角色。把它想像成一位訊息傳遞者,負責在不同的Activity或元件之間傳遞請求與資料。最常見的場景就是使用者登入後,畫面會從登入頁面跳轉到應用程式的主頁。這整個流程就是由 Intent 來驅動,它帶著「開啟主頁面」的指令,觸發頁面的切換

Intent兩種類型

  1. 明確意圖 (Explicit Intent)
    • 用途: 當你知道要啟動哪一個應用程式頁面時使用,這是在應用程式內部常見的使用方式
    • 運作方式:直接指定目標(例如:SecondActivity)系統會找到並啟動
    • 例子
      • 從主頁面(MainActivity)跳轉到次頁面(SecondActivity)
  2. 隱含意圖 (Implicit Intent)
    • 用途: 當你不知道由哪個元件來處理請求,或是想要將選擇權交給使用者時使用。你只描述你想要做的動作,由系統來找到適合處理這個動作的應用程式
    • 運作方式:不指定具體元件,而是定義一個動作、類別或資料,系統會比對所有已安裝應用程式的Intent Filter,找符合條件的元件讓使用者選擇或是直接啟動唯一的那個
    • 例子
      • 點擊一個網址,系統會詢問使用者想用哪個瀏覽器開啟
      • 點擊分享,系統會列出所有可以處理分享功能的應用程式 (如 LINE, Messenger, Email……)

用Intent啟動Activity並傳遞資料

為了讓兩個Activity能夠溝通,要使用Intent來啟動目標 Activity,並透過其"Extra"附加資料

  1. putExtra(String name, value)
    • 功能: 將各種基本資料型態或可序列化的物件打包放進Intent中。這就像是把信件貼上一個寫好標籤的包裹
    • 說明:
      • String name:一個字串Key,作為這筆資料的識別物。在接收端,會需要用這個一模一樣的Key來取出資料。可以定義成常數避免錯誤
      • value:你想傳遞的實際資料
  2. startActivity(Intent intent)
    • 功能:執行Intent,啟動指定的Activity。這是單向操作,當啟動了新的Activity,原始的Activity不會等待返回結果
    • 觸發時機:當你只想跳轉到新頁面並傳遞資料,不需要新頁面回傳結果時
  3. finish()
    • 功能:告知系統這個Activity的任務完成了,把它關閉並釋放佔用的資源
    • 觸發時機
      • 暫時性的頁面:當一個Activity只是用來執行某個任務,而且完成後不用返回時
      • 完成使用者輸入:在一個設定頁面或表單頁面,當使用者點擊儲存或完成按鈕後,通常會啟動上一個頁面,也會呼叫finish()關閉當前的設定頁
      • 登出操作:使用者在應用程式中點擊登出後,要關閉所有與使用者帳號相關的頁面,並回到登入頁。這時就可以用 finish()來確保使用者無法透過返回鍵回到登入前的狀態
  4. 在新Activity中接收資料
    • 功能:在被啟動的Activity中,透過getIntent()方法取得啟動Intent,然後使用get...Extra()將資料取出來
    • 常用方法
      • getStringExtra(String name)
      • getIntExtra(String name, int defaultValue)
      • getBooleanExtra(String name, boolean defaultValue)
    • 說明
      • name:與putExtra()時使用的Key相同
      • defaultValue:一個預設值

範例:

透過簡單的BMI 計算機應用程式,帶你了解如何使用 Intent,這範例會用到兩個Activity:

MainActivity:使用者輸入身高和體重

ResultActivity:顯示計算出來的 BMI 結果

我們先建立ResultActivity,顯示計算結果的頁面

  1. 在 Android Studio 專案中,點左側的專案視窗
  2. 在 app/java/com.example…. 的資料夾點右鍵
  3. 選擇 New → Activity → Empty Views Activity
  4. 將Activity 命名

在activity_main.xml建立元件

    <EditText
        android:id="@+id/height_main_et"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:hint="身高(m)"
        android:inputType="numberDecimal" />
    <EditText
        android:id="@+id/weight_main_et"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:hint="體重(Kg)"
        android:inputType="numberDecimal" />
    <Button
        android:id="@+id/result_main_btn"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="計算" />
        <!--動動小手設計.w. -->

寫MainActivity.java的程式

public class MainActivity extends AppCompatActivity {

    private Button resultButton;
    private EditText heightEditText;
    private EditText weightEditText;

    public static final String bmiResultPutExtra = "bmiResult";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        resultButton = findViewById(R.id.result_main_btn);
        heightEditText = findViewById(R.id.height_main_et);
        weightEditText = findViewById(R.id.weight_main_et);

        resultButton.setOnClickListener(v -> {
        
            String heightStr = heightEditText.getText().toString();
            String weightStr = weightEditText.getText().toString();

            if (TextUtils.isEmpty(heightStr) || TextUtils.isEmpty(weightStr)) {
                
                Toast.makeText(this, "身高和體重不能為空!", Toast.LENGTH_SHORT).show();
                return;
            }

            float height = Float.parseFloat(heightStr);
            float weight = Float.parseFloat(weightStr);

            if (height <= 0) {
                Toast.makeText(this, "身高必須大於 0!", Toast.LENGTH_SHORT).show();
                return;
            }

            float bmi = weight / (height * height);

            Intent intent = new Intent(this, ResultActivity.class);
            intent.putExtra(bmiResultPutExtra, bmi);
            
            startActivity(intent);

        });
    }
}

在ResultActivity.XML建立元件

<TextView
        android:id="@+id/result_result_tv"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:textSize="30sp"
        android:layout_gravity="center"
        android:text="結果"
        android:gravity="center"/>

<Button
        android:id="@+id/back_result_btn"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_gravity="center"
        android:text="計算完成回到上一頁" />

寫ResultActivity.java的程式

public class ResultActivity extends AppCompatActivity {

    @SuppressLint("DefaultLocale")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);

        Button backButton = findViewById(R.id.back_result_btn);
        TextView resultTextView = findViewById(R.id.result_result_tv);

        float bmi = getIntent().getFloatExtra(MainActivity.bmiResultPutExtra,0.0f);
        resultTextView.setText(String.format("%.2f", bmi));

        backButton.setOnClickListener(v -> finish());

    }
}

Intent就先介紹到這,希望大家都了解了,明天會來介紹Spinner,明天見( σ՞ਊ ՞)σ

https://ithelp.ithome.com.tw/upload/images/20250927/20176154iqIUW7RzGY.png


上一篇
Day12 SeekBar介紹
下一篇
Day14 Spinner介紹
系列文
Android 菜鳥30天從0到1的學習紀錄15
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言