發送自訂廣播

1. 自訂廣播接收器 MyBroadcastReceiver.java

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "接收到我們自訂的廣播", Toast.LENGTH_LONG).show();
    }
}
Code language: JavaScript (javascript)

2. AndroidManifest.xml 註冊接收器(資訊清單檔)

在 <application> 標籤內加入:

<receiver
    android:name=".MyBroadcastReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="com.foxdevelop.www.broadcastdemo.MY_BROADCAST" />
    </intent-filter>
</receiver>
Code language: HTML, XML (xml)

重點:action 的名稱,後續發送廣播時使用的Intent字串必須和這裡完全一致

3. activity_main.xml 版面配置(按鈕)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/btn_send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="發送廣播"/>
</LinearLayout>
Code language: HTML, XML (xml)

4. MainActivity.java 主Activity(點擊按鈕發送廣播)

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = findViewById(R.id.btn_send);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // action字串必須與資訊清單內的action完全相同
                Intent intent = new Intent("cn.bamn.www.broadcastdemo.MY_BROADCAST");
                sendBroadcast(intent);
            }
        });
    }
}
Code language: JavaScript (javascript)

標準廣播 vs 有序廣播

  1. 標準廣播 sendBroadcast() 非同步廣播,所有接收器幾乎同時收到,無順序、無法中斷。
  2. 有序廣播 sendOrderedBroadcast() 依照優先權順序接收廣播,前面的接收器可以呼叫 abortBroadcast() 終止廣播,後面接收器就收不到。

截圖中的錯誤訊息:Activity class ...MainActivity does not exist

錯誤含義:系統找不到MainActivity這個類別

常見原因

  1. AndroidManifest.xml 中Activity的android:name路徑寫錯(最常見)
    • 套件名稱與類別名稱不匹配,大小寫錯誤
    • 語法說明:android:name=".MainActivity",. 代表在目前application套件底下
    • 驗證方式:在IDE按住Ctrl點擊類別名稱,若能跳轉到MainActivity,代表路徑正確
  2. 套件名稱不一致:build.gradle裡的applicationId 和資訊清單的package名稱不符
  3. 類別檔遺失:MainActivity.java被刪除 / 檔名寫錯(Java類別名稱必須和檔名完全相同,區分大小寫)
  4. 編譯問題:專案編譯失敗,沒有產生class檔;清理專案重建(Build -> Clean Project)
  5. 大小寫問題:Mainactivity 和 MainActivity 是兩個不同類別,Android會區分大小寫

簡易除錯步驟

  1. 打開 AndroidManifest.xml,找到啟動用Activity節點<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
  2. 按住Ctrl點擊 .MainActivity,測試是否可以跳轉程式碼
  3. 無法跳轉 → 修改android:name為正確完整類別名稱
  4. 可以跳轉 → 執行 Clean Project,重新建置、重新安裝apk

補充:新版Android(API26以上)注意:靜態註冊隱式廣播有諸多限制,很多系統隱式廣播不允許靜態註冊,但自訂action的隱式廣播不受此限制,可以正常運作,本範例可直接執行。

發送自訂廣播

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *