[Android] Broadcast Receiver

參考連結:https://developer.android.com/guide/components/broadcasts.html

一般來說 Broadcast Receiver 可以分成以下兩種:
1. Manifest-declared Receiver
定義 receiver 在 manifest 中:






定義 receiver 成一個 BroadcastReceiver 的 subclass,並且要執行 OnReceive 的功能,如同以下:

public class MyBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = “MyBroadcastReceiver”;
@Override
public void onReceive(Context context, Intent intent) {
StringBuilder sb = new StringBuilder();
sb.append(“Action: ” + intent.getAction() + “\n”);
sb.append(“URI: ” + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + “\n”);
String log = sb.toString();
Log.d(TAG, log);
Toast.makeText(context, log, Toast.LENGTH_LONG).show();
}
}

這樣在程式安裝的時候,這個 Receiver 就會被獨立安裝在活動之外,因此這個 Receiver 可以變成啟動程式的一個關鍵。

2. Context-registered Receiver

另外也可以註冊一個 Receiver 給一個特定的 Context,利用以下的方法:
新增一個新定義的 MyBroadcastReceiver:

BroadcastReceiver br = new MyBroadcastReceiver();

新定義一個 IntentFilter 新增其應該要反應的功能,然後註冊這個 Receiver。新註冊的 BroadcastReceiver 會跟著 Context 一起進行,所以如果註冊在一個 Activity 的話,只要這個 Activity 沒有被摧毀的話,廣播都會有效,如果是註冊在一個 Application 的話,只要這個 Application 都還在運行,廣播接收功能都不會失效。

IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
this.registerReceiver(br, filter);

一般來說,MyBroadcastReceiver 會執行任何的呼叫(Intent),但是使用 intentfilter 可以減少呼叫的總類。