Android開發(fā)-靜態(tài)廣播(包含broadcast向activity中傳值),動(dòng)態(tài)廣播(有序/無序)使用介紹

?簡(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?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容