一姨伟,BroadcastReceiver簡單理解
BroadcastReceiver是安卓四大組件之一山卦,在開發(fā)用應(yīng)用到的場景也很多岩饼。廣播接收器,就是一個(gè)全局的監(jiān)聽器低剔,分為兩種角色:‘廣播發(fā)送者’速梗,‘廣播接收者’肮塞。監(jiān)聽或者接收應(yīng)用發(fā)出的廣播消息,并做出相應(yīng)的操作镀琉。一般應(yīng)用在:不同組件間的通信峦嗤,多線程通信蕊唐,Android系統(tǒng)廣播屋摔。如:網(wǎng)絡(luò)狀態(tài)是否可用,開機(jī)時(shí)替梨。
采用的設(shè)計(jì)模式是觀察者模式钓试。
1,自定義一個(gè)廣播接收器
繼承BroadcastReceiver
重寫onReceive()方法
注意:廣播接收器運(yùn)行在主線程中副瀑,所以onReceive()方法中不能執(zhí)行耗時(shí)操作弓熏,會(huì)引起ANR問題
public class MyBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String string=intent.getAction();
//接收到廣播需要做的操作。此處我們打印一個(gè)提示
Toast.makeText(context,string,Toast.LENGTH_LONG).show();
}
}
2糠睡,廣播注冊(cè)方式有兩種:動(dòng)態(tài)注冊(cè)挽鞠,靜態(tài)注冊(cè),
靜態(tài)注冊(cè):
在AndroidManifest.xml中添加<receiver>標(biāo)簽
<receiver
android:name=".broad.MyBroadcast"
android:enabled="true"
android:exported="true">
<intent-filter>
//自定義廣播
<action android:name="com.dream.broadcasttest.MY_BROADCAST"></action>
</intent-filter>
</receiver>
動(dòng)態(tài)注冊(cè)
注意:動(dòng)態(tài)注冊(cè)一定要注銷狈孔。否則會(huì)出現(xiàn)內(nèi)存泄露的問題
public class MainActivity2 extends AppCompatActivity {
private Button button,button2;
private MyBroadcast myBroadcast;
private IntentFilter intentFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
button = (Button) findViewById(R.id.but_broad);
button2=(Button)findViewById(R.id.but_broad_send);
myBroadcast = new MyBroadcast();
intentFilter = new IntentFilter();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//動(dòng)態(tài)注冊(cè)廣播
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(myBroadcast, intentFilter);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//自定義廣播
Intent intent=new Intent("com.dream.broadcasttest.MY_BROADCAST");
intent.setPackage(getPackageName());
sendBroadcast(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
//動(dòng)態(tài)注冊(cè)廣播之后需要在onDestroy中取消注冊(cè)
unregisterReceiver(myBroadcast);
}
}
兩種注冊(cè)方式的區(qū)別:
3信认,廣播的類型主要有五種
普通廣播 Normal Broadcast
系統(tǒng)廣播 System Broadcast
有序廣播 Ordered Broadcast
粘性廣播 Sticky Broadcast
APP應(yīng)用內(nèi)廣播 Local Broadcast
普通廣播也是自定義廣播,是比較常用的均抽。
系統(tǒng)廣播
有序廣播和普通廣播一樣嫁赏,只是發(fā)送廣播的方法是
sendOrderedBroadcast(intent);
有序廣播接收者接收廣播的順序規(guī)則
- 按照priority屬性值大小排序
- priority值相同時(shí),動(dòng)態(tài)廣播優(yōu)先
在這里插播一下油挥,Android 9.0對(duì)廣播的重大調(diào)整潦蝇,為提高安卓系統(tǒng)的安全性,從9.0開始系統(tǒng)全面禁止靜態(tài)注冊(cè)的廣播深寥,凡是靜態(tài)廣播在9.0系統(tǒng)中都不再有效攘乒,因此為了適配Android 9.0,靜態(tài)注冊(cè)廣播都要換成在代碼中動(dòng)態(tài)注冊(cè)廣播惋鹅。
如果9.0想要發(fā)送靜態(tài)廣播持灰,那么要發(fā)送定向廣播才可以接收到靜態(tài)廣播。如下
AndroidManifest中靜態(tài)注冊(cè)
<receiver android:name="com.dream.broad.MyBroadcast"
android:exported="true">
<intent-filter>
<action android:name="com.dream.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
發(fā)送時(shí)候指定包名com.dream.broad.MyBroadcast
Intent poweronff = new Intent();
poweronff.setPackage("com.dream.broad");
poweronff.setAction("com.bob.intent.action.POWER_ON_OFF_TIMER");
poweronff.putExtra("enable",true);
poweronff.putExtra("timeon",poweron);
poweronff.putExtra("timeoff",poweroff);
sendBroadcast(poweronff);