iT邦幫忙

2022 iThome 鐵人賽

DAY 16
0

BroadCast 是一種溝通的方法,可以用在CallBack回傳,透過此方法可以在收到回傳值時發出廣播,讓接收廣播者做出對應的動作,主要分成註冊、接收。

流程

  1. 建立Utilties.class 負責放廣播的事件
public class Utilities {
    //廣播事件(發送)
    public static final String SEND_BROADCAST="SEND_BROADCAST";
}
  1. 新增廣播的事件
protected void onResume() {
    super.onResume();
    final IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(Utilities.SEND_BROADCAST);
}

這個步驟將需要或可能會發送的廣播先行註冊(addAction()),不註冊的話接收這就不知道這項廣播是甚麼,就算有寫接收也沒辦法成功收到對應的廣播喔!

  1. 建立Receiver
private class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        switch (intent.getAction()){
            case Utilities.SEND_BROADCAST:
                //接收到廣播時的行為
        }
    }
}

透過intent.getAction()獲取此次接受到廣播的行為為何,並根據Action決定對應的行為,也可以接收廣播時傳的data。
4. 宣告Receiver

private final MyReceiver myReceiver = new MyReceiver();
  1. 註冊廣播與接收器
protected void onResume() {
    super.onResume();
    ...
    //註冊廣播(Receiver,intentFilter),包含Receiver和addAction()過的intentFilter
    LocalBroadcastManager.getInstance(this).registerReceiver(myReceiver,intentFilter);
}       

經過此步驟才是真正的完成註冊喔~!
6. 發送廣播

send_btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent();
        //設定Action
        intent.setAction(Utilities.SEND_BROADCAST);
        //傳送Data
        intent.putExtra("message","廣播發送完成");
        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
    }
});
  1. 接收廣播
private class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        switch (intent.getAction()){
            case Utilities.SEND_BROADCAST:
                //接收到廣播時的行為
                String result = intent.getStringExtra("message");
                result_txt.setText(result);
                break;
        }
    }
}

在intent中加入此次行為的Action為何,好讓Receiver依照此Action判斷並做出對應的行為喔。
7. 解除註冊

@Override
protected void onStop() {
    super.onStop();
    //解除註冊
    LocalBroadcastManager.getInstance(this).unregisterReceiver(myReceiver);
}

再不需要接收廣播時,記得解除,才可以避免收到不該收的廣播以及資源的浪費喔。


結語

以上步驟,如果有漏都可能造成廣播的失敗,不論是發送或是接收,尤其是新增addAction(),在我使用的時候常常被我遺忘,所以各位如果需要使用廣播的話,可以在每次新增新的Action時,依照這個順序檢查一遍才不會,明明註冊了卻莫名其妙的接不到廣播喔。


上一篇
精華筆記 Day15-- Service
下一篇
精華筆記 Day17--Notification
系列文
android studio 30天 精華筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言