一、BroadcastReceiver解析
(1)廣播注冊使用
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String name = intent.getStringExtra("name");
}
}
(2)動態注冊廣播
public class MainActivity extends AppCompatActivity {
private MyBroadcastReceiver myBroadcastReceiver;
private IntentFilter intentFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myBroadcastReceiver = new MyBroadcastReceiver();
intentFilter = new IntentFilter();
intentFilter.addAction("android.intent.action.MY_BROADCAST_RECEIVER");
registerReceiver(myBroadcastReceiver, intentFilter);//注冊廣播
}
//發送廣播
private void sendOut(){
Intent intent = new Intent("android.intent.action.MY_BROADCAST_RECEIVER");
intent.putExtra("name","name");
sendBroadcast(intent);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myBroadcastReceiver);//注解廣播
}
}
(3)在配置文件中靜態注冊廣播
<receiver android:name=".類名">
<intent-filter>
<action android:name="android.intent.action.MY_BROADCAST_RECEIVER"/>
</intent-filter>
</receiver>
特點:動態注冊廣播接收器特點是當用來注冊的Activity關掉后,廣播也就失效了。靜態注冊無需擔憂廣播接收器是否被關閉,只要設備是開啟狀態,廣播接收器也是打開著的
(4)其他廣播
- 有序廣播:將sendBroadcast改成sendOrderedBroadcast。priority接收廣播的優先級
- 系統廣播:
屏幕被關閉:Intent.ACTION_SCREEN_OFF
屏幕被打開:Intent.ACTION_SCREEN_ON
系統啟動完成:Intent.ACTION_BOOT_COMPLETED
網絡變化:android.net.conn.CONNECTIVITY_CHANGE
充電時或電量發生變化:Intent.ACTION_BATTERY_CHANGED - 本地廣播:只有動態注冊的廣播才能使用,主要使用了一個LocalBroadcastManager來對廣播進行管理,并提供了相應的發送廣播和注冊廣播接收器的方法
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
//注冊廣播
localBroadcastManager.registerReceiver(myBroadcastReceiver,intentFilter);
//發送廣播
localBroadcastManager.sendBroadcast(intent);
//反注冊廣播
localBroadcastManager.unregisterReceiver(myBroadcastReceiver);
- 粘性廣播:.sendStickyBroadcast發送粘性廣播,廣播會一直滯留,當有匹配該廣播的接收器被注冊后,該接收器就會收到此條廣播。sendStickyBroadcast只保留最后一條廣播,并且一直保留。如果只想處理一遍該廣播,可通過removeStickyBroadcast來實現。
BroadcastReceiver源碼解析