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 有序廣播
- 標準廣播 sendBroadcast() 非同步廣播,所有接收器幾乎同時收到,無順序、無法中斷。
- 有序廣播 sendOrderedBroadcast() 依照優先權順序接收廣播,前面的接收器可以呼叫
abortBroadcast()終止廣播,後面接收器就收不到。
截圖中的錯誤訊息:Activity class ...MainActivity does not exist
錯誤含義:系統找不到MainActivity這個類別
常見原因
- AndroidManifest.xml 中Activity的
android:name路徑寫錯(最常見)- 套件名稱與類別名稱不匹配,大小寫錯誤
- 語法說明:
android:name=".MainActivity",.代表在目前application套件底下 - 驗證方式:在IDE按住Ctrl點擊類別名稱,若能跳轉到MainActivity,代表路徑正確
- 套件名稱不一致:build.gradle裡的applicationId 和資訊清單的package名稱不符
- 類別檔遺失:MainActivity.java被刪除 / 檔名寫錯(Java類別名稱必須和檔名完全相同,區分大小寫)
- 編譯問題:專案編譯失敗,沒有產生class檔;清理專案重建(Build -> Clean Project)
- 大小寫問題:
Mainactivity和MainActivity是兩個不同類別,Android會區分大小寫
簡易除錯步驟
- 打開 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> - 按住Ctrl點擊
.MainActivity,測試是否可以跳轉程式碼 - 無法跳轉 → 修改
android:name為正確完整類別名稱 - 可以跳轉 → 執行
Clean Project,重新建置、重新安裝apk
補充:新版Android(API26以上)注意:靜態註冊隱式廣播有諸多限制,很多系統隱式廣播不允許靜態註冊,但自訂action的隱式廣播不受此限制,可以正常運作,本範例可直接執行。
發送自訂廣播
Previous: 使用靜態註冊的方式實作開機提示
Next: Android 跨應用程式接收廣播