BroadcastReceiver又叫廣播接收器,是Android四大組件之一。
註冊方式:
1、動態註冊,也就是在代碼中進行註冊,註冊方式如下:
public class MainActivity extends AppCompatActivity {
private IntentFilter mIntentFilter;
private MyBroadcastReceive mMyBroadcastReceive;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mIntentFilter = new IntentFilter();
mIntentFilter.addAction("你自己定義或系統的Action");
mMyBroadcastReceive = new MyBroadcastReceive();
registerReceiver(mMyBroadcastReceive, mIntentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mMyBroadcastReceive);
}
}
優點:使用靈活,跟隨所註冊組件的生命週期變化。
缺點:在組件殺死前,必須移除廣播接收器。
使用場景:需要在特定時刻監聽廣播。
2、靜態註冊
靜態註冊也就是在AndroidMenifest.xml文件中註冊:
<receiver
android:name=".MyBroadcastReceive"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.yrf.broadcastreceivertest.myBroadcast" />
</intent-filter>
</receiver>
在AndroidMenifest中定義一個receiver字段即可,enabled表示是否啓用這個廣播接收器,exported表示是否允許接收其他應用程序發送的廣播。
優點:常駐,不受任何組件的生命週期影響。
缺點:耗電,佔內存。
使用場景:需要時刻監聽廣播。
發送方式:
1、標準廣播:這是一種完全異步的廣播,在廣播發出之後,所有符合規則的廣播接收器幾乎都會在同一時刻接收到這條廣播消息。發送標準廣播使用sendBroadcast()方法。
2、有序廣播:這是一種完全同步的廣播,在廣播發出之後,同一時刻只有一個廣播接收器能夠收到這條廣播消息,當這個廣播接收器中的邏輯執行完畢後,廣播纔會繼續傳遞。廣播接收器的傳播先後順序是根據優先級來的。發送有序廣播使用sendOrderedBroadcast()方法。
優先級設置方法:在intentFilter中添加priority字段即可:
<receiver
android:name=".MyBroadcastReceive"
android:enabled="true"
android:exported="true"
>
<intent-filter android:priority="1000">
<action android:name="com.yrf.broadcastreceivertest.myBroadcast" />
</intent-filter>
</receiver>
本地廣播:
本地廣播是一種屬於只能被本程序廣播接收器接收的廣播,使用方式如下:
public class MainActivity extends AppCompatActivity {
private IntentFilter mIntentFilter;
private MyBroadcastReceive mMyBroadcastReceive;
private LocalBroadcastManager mLocalBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mIntentFilter = new IntentFilter();
mIntentFilter.addAction("com.yrf.broadcastreceivertest.myBroadcast1");
mMyBroadcastReceive = new MyBroadcastReceive();
mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
mLocalBroadcastManager.registerReceiver(mMyBroadcastReceive, mIntentFilter);
findViewById(R.id.btn_send).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("com.yrf.broadcastreceivertest.myBroadcast1");
mLocalBroadcastManager.sendBroadcast(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocalBroadcastManager.unregisterReceiver(mMyBroadcastReceive);
}
}
注意:本地廣播只能通過動態註冊的方式來發送消息。
優點:1、保密性高。2、沒有安全漏洞的隱患。3、比全局廣播更加高效。
參考資料:第一行代碼。