?簡(jiǎn)介:
1.按照發(fā)送方式分為兩類:
(1)標(biāo)準(zhǔn)廣播/無序廣播
采用異步方式傳播,廣播發(fā)出后,所有的廣播接收者幾乎是同一時(shí)間收到消息的。接收沒有先后順序可言,不可以被攔截。
(2)有序廣播
同步執(zhí)行的廣播,在廣播發(fā)出后,同一時(shí)刻只有一個(gè)廣播接收器可以收到消息,有優(yōu)先級(jí)之分,當(dāng)廣播中的邏輯執(zhí)行完成后,廣播才會(huì)繼續(xù)傳播。
2按照注冊(cè)的方式分類
(1)動(dòng)態(tài)注冊(cè)廣播
在代碼中注冊(cè)的,推薦。
(2)靜態(tài)注冊(cè)廣播
動(dòng)態(tài)注冊(cè)要求程序必須在運(yùn)行時(shí)才能進(jìn)行,有一定的局限性,如果我們需要在程序還沒啟動(dòng)的時(shí)候就可以接收到注冊(cè)的廣播,就需要靜態(tài)注冊(cè)了。主要是在AndroidManifest中進(jìn)行注冊(cè)。
3.按照定義的方式分類
(1)系統(tǒng)廣播
Android系統(tǒng)中內(nèi)置了多個(gè)系統(tǒng)廣播,每個(gè)系統(tǒng)廣播都具有特定的intent-filter,其中主要包括具體的action,系統(tǒng)廣播發(fā)出后,將被相應(yīng)的BroadcastReceiver接收。系統(tǒng)廣播在系統(tǒng)內(nèi)部當(dāng)特定事件發(fā)生時(shí),由系統(tǒng)自動(dòng)發(fā)出。
(2)自定義廣播
由應(yīng)用程序開發(fā)者自己定義的廣播
Android開發(fā)中作用:
(1)當(dāng)我們需要接收系統(tǒng)發(fā)出或者別的程序發(fā)出來的消息的時(shí)候,就需要用到廣播接收器。
(2)我們需要在應(yīng)用之中傳遞一些數(shù)據(jù)時(shí),我們也可以用本地廣播來發(fā)送和接收這些消息。
(3)可以通過廣播給不同的界面發(fā)送更新信息,對(duì)界面進(jìn)行刷新。當(dāng)然也可以用觀察者設(shè)計(jì)模式進(jìn)行操作(詳見:Android開發(fā)-通過觀察者設(shè)計(jì)模式刷新和關(guān)閉界面)。事實(shí)上,從實(shí)現(xiàn)原理看,Android中的廣播就是使用了觀察者模式,基于消息的發(fā)布/訂閱事件模型。
靜態(tài)注冊(cè)舉例:
步驟一:在清單文件AndroidManifest.xml注冊(cè)
???????????android:name="com.huwan.broadcastjingtaidemo.MyBroadcastReceiver"
??????????? android:enabled="true"
???????????android:exported="true">
???????????
?????? ?????????
步驟二:寫一個(gè)MyBroadcastReceiver.java接收器
packagecom.huwan.broadcastjingtaidemo;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.widget.Toast;
importjava.io.IOException;
// 實(shí)現(xiàn)一個(gè)廣播接收器
publicclass MyBroadcastReceiver extends BroadcastReceiver {
??? @Override
??? public void onReceive(Context context,Intent intent) {
??????? Toast.makeText(context, "receivedin MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
??? }
}
步驟三:MainActivity.java主界面
packagecom.huwan.broadcastjingtaidemo;
importandroid.app.Activity;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.IntentFilter;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.TextView;
importandroid.widget.Toast;
publicclass MainActivity extends Activity {
??? Button btn;
??? TextView tv;
??? @Override
??? protected void onCreate(BundlesavedInstanceState) {
??????? super.onCreate(savedInstanceState);
??????? setContentView(R.layout.activity_main);
??????? btn = findViewById(R.id.btn);
??????? tv = findViewById(R.id.tv);
??? }
}
靜態(tài)廣播Demo樣例下載:
http://www.huwan.xin/Source/AppPackage/ZIP/Android/BroadCastJingtaiDemo.rar
靜態(tài)注冊(cè)傳值給activity舉例:
(數(shù)據(jù)傳遞的方式有很多種,例如bundle,handler,intent,重新發(fā)一個(gè)廣播,第三方eventbus等各種形式;我傾向于使用接口回調(diào)來寫,但是寫了五個(gè)小時(shí)始終報(bào)空指針,內(nèi)心崩潰,最后使用觀察者設(shè)計(jì)模式,本質(zhì)其實(shí)還是接口回調(diào),但是不知道為什么接口回調(diào)我沒寫成功,如果有朋友寫出了比較簡(jiǎn)單的代碼,歡迎和我溝通,謝謝)
步驟一:導(dǎo)入觀察者封裝好的三個(gè)java文件,下面可以下載的demo中有。
步驟二:在清單文件AndroidManifest.xml注冊(cè)
???????????android:name="com.huwan.broadcastjingtaidemo.MyBroadcastReceiver"
??????????? android:enabled="true"
???????????android:exported="true">
???????????
?????? ?????????
步驟二:寫一個(gè)MyBroadcastReceiver.java接收器
packagecom.huwan.broadcastjingtaidemo;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.widget.Toast;
importjava.io.IOException;
// 實(shí)現(xiàn)一個(gè)廣播接收器
publicclass MyBroadcastReceiver extends BroadcastReceiver {
??? @Override
??? public void onReceive(Context context,Intent intent) {
??????? Toast.makeText(context, "receivedin MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
ObserverManager.getInstance().notifyObserver("觀察者請(qǐng)刷新信息");
??? }
}
步驟三:MainActivity.java主界面
packagecom.huwan.broadcastjingtaidemo;
importandroid.app.Activity;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.IntentFilter;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.TextView;
importandroid.widget.Toast;
publicclass MainActivity extends Activity {
??? Button btn;
??? TextView tv;
??? @Override
??? protected void onCreate(BundlesavedInstanceState) {
??????? super.onCreate(savedInstanceState);
??????? setContentView(R.layout.activity_main);
??????? btn = findViewById(R.id.btn);
??????? tv = findViewById(R.id.tv);
?????????????????? ObserverManager.getInstance().add(this);//注冊(cè)
}
@Override
??? public voidobserverUpData(String content) {
??????? tv.setText(content);
??? }
?//銷毀非常非常重要,一定不要忘記了
?@Override
protected void onDestroy() {
????? super.onDestroy();
????? ObserverManager.getInstance().remove(this);
? }
}
靜態(tài)廣播注冊(cè)傳值Demo樣例下載:
http://www.huwan.xin/Source/AppPackage/ZIP/Android/BroadCastJingtaiChuanzhiDemo.rar
參考閱讀:Android開發(fā)-通過觀察者設(shè)計(jì)模式刷新數(shù)據(jù)或者關(guān)閉界面
參考樣例:手機(jī)網(wǎng)絡(luò)切換,通過接口回調(diào)通知主界面
Demo下載:
http://www.huwan.xin/Source/AppPackage/ZIP/Android/BroadCastWithNetWorkState.rar
動(dòng)態(tài)廣播:(無序)
packagecom.huwan.broadcastdynamicdemo1;
importandroid.app.Activity;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.IntentFilter;
importandroid.icu.text.SimpleDateFormat;
importandroid.os.Build;
importandroid.os.Bundle;
importandroid.support.annotation.RequiresApi;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.TextView;
importjava.util.Date;
publicclass MainActivity extends Activity {
??? Button btn;
??? TextView tv;
MyReceiver receiver;???????????????
@Override
??? protected void onCreate(BundlesavedInstanceState) {
??????? super.onCreate(savedInstanceState);
??????? setContentView(R.layout.activity_main);
??????? //1.注冊(cè)廣播
??????? receiver = new MyReceiver();
??????? IntentFilter filter=new IntentFilter();
???????filter.addAction("com.huwan.broadcast.send");
???????MainActivity.this.registerReceiver(receiver,filter);
??????? btn = findViewById(R.id.btn);
??????? tv = findViewById(R.id.tv);
??????? // 2.點(diǎn)擊按鈕,發(fā)送一個(gè)無序的廣播
??????? btn.setOnClickListener(newView.OnClickListener() {
??????????? @Override
??????????? public void onClick(View v) {
??????????????? Intent intent = new Intent();
???????????????intent.setAction("com.huwan.broadcast.send");
??????????????? sendBroadcast(intent);
??????????? }
??????? });
??? }
??? //3.自定義一個(gè)廣播接收器
??? public class MyReceiver extendsBroadcastReceiver {
??????? @Override
??????? public void onReceive(Context context,Intent intent) {
??????????? tv.setText("收到一個(gè)無序廣播----"+ new Date());
??????? }
}
? //4.界面關(guān)閉的時(shí)候注銷廣播
??? @Override
??? protected void onDestroy() {
??????? unregisterReceiver(receiver);
??????? super.onDestroy();
??? }
}
// 舉例是在主MainActivity中,要發(fā)送廣播的時(shí)候,直接把發(fā)送廣播的代碼寫到其他acitivity中即可。
Intentintent = new Intent();
intent.setAction("com.huwan.broadcast.send");
sendBroadcast(intent);
上面三行代碼是發(fā)送廣播的代碼,處理接收廣播的代碼,既可以靜態(tài)也可以動(dòng)態(tài)。上面都有,就不寫demo了。
動(dòng)態(tài)廣播:(有序)
步驟一:配置清單文件AndroidManifest.xml
??? package="com.huwan.broadcastdynamicdemo2">
??????? android:allowBackup="true"
???????android:icon="@mipmap/ic_launcher"
???????android:label="@string/app_name"
???????android:roundIcon="@mipmap/ic_launcher_round"
??????? android:supportsRtl="true"
???????android:theme="@style/AppTheme">
???????
???????????
???????????????
???????????????
???????
???????????
???????????????
???????
???????????
???????????????
???????
???????????
???????????????
???????
???????????
???????????????
步驟二:主界面MainActivity.java寫一個(gè)發(fā)送有序廣播
packagecom.huwan.broadcastdynamicdemo2;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.Button;
publicclass MainActivity extends Activity {
??? @Override
??? protected void onCreate(BundlesavedInstanceState) {
??????? super.onCreate(savedInstanceState);
??????? setContentView(R.layout.activity_main);
??????? Button btn = findViewById(R.id.btn);
??????? btn.setOnClickListener(newView.OnClickListener() {
??????????? @Override
??????????? public void onClick(View v) {
??????????????? Intent intent = new Intent();
??????????????? intent.setAction("com.huwan.broadcast.kaihui");
??????????????? //有序廣播,可被攔截,可終止,可以修改數(shù)據(jù)。
??????????????? sendOrderedBroadcast(intent,null, new Level4Receiver(), null, 0, "早上十點(diǎn)開會(huì)", null);
??????????? }
??????? });
??? }
}
步驟三:寫優(yōu)先級(jí)不同的界面分別接收到消息
Level1Receiver.java
packagecom.huwan.broadcastdynamicdemo2;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
publicclass Level1Receiver extends BroadcastReceiver {
??? @Override
??? public void onReceive(Context context,Intent intent) {
??????? String message = getResultData();
??????? System.out.println("系主任得到的消息:"+ message);
??????? setResultData("早上九點(diǎn)開會(huì)");
??? }
}
------------------------------------------------------------
Level2Receiver.java
packagecom.huwan.broadcastdynamicdemo2;
importandroid.app.AlertDialog;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
publicclass Level2Receiver extends BroadcastReceiver {
??? @Override
??? public void onReceive(Context context,Intent intent) {
??????? String message = getResultData();
??????? System.out.println("班主任得到的消息:"+message);
??????? setResultData("早上八點(diǎn)開會(huì)!");
??? }
}
------------------------------------------------------------
Level3Receiver.java
packagecom.huwan.broadcastdynamicdemo2;
importandroid.app.AlertDialog;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
publicclass Level3Receiver extends BroadcastReceiver {
??? @Override
??? public void onReceive(Context context,Intent intent) {
??????? String message = getResultData();
??????? System.out.println("班長(zhǎng)得到的消息:"+message);
??????? abortBroadcast(); //無序廣播需要終止(重要)
??????? setResultData("早上七點(diǎn)開會(huì)");
??? }
}
------------------------------------------------------------
Level4Receiver.java
packagecom.huwan.broadcastdynamicdemo2;
importandroid.app.AlertDialog;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
publicclass Level4Receiver extends BroadcastReceiver {
??? @Override
??? public void onReceive(Context context,Intent intent) {
??????? String message = getResultData();
??????? System.out.println("學(xué)生得到的的消息:"+ message);
??????? newAlertDialog.Builder(context).setTitle("消息")
??????????????? .setMessage("學(xué)生得到的的消息:"+message)
??????????????? .setPositiveButton("知道了", null).setCancelable(true).show();
??? }
}
動(dòng)態(tài)無序廣播Demo樣例下載:
http://www.huwan.xin/Source/AppPackage/ZIP/Android/BroadCastDynamicdemo2.rar
更多內(nèi)容請(qǐng)?jiān)L問:www.huwan.xin
??C?6?????7d?