05廣播-發(fā)送自定義廣播及本地廣播

廣播主要分兩種類型:標(biāo)準(zhǔn)廣播和有序廣播

發(fā)送標(biāo)準(zhǔn)廣播

  1. 首先定義一個(gè)廣播接收器來接收此廣播蚂四,新建一個(gè)MyBroadcastReceiver

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_LONG).show();
    }
}

  1. 在AndroidManifest.xml中對(duì)這個(gè)廣播接收器進(jìn)行修改
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.md.bb">

    ...

        <receiver
            android:name=".MyBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.md.MY_BROADCAST"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

  • 這里讓MyBroadcastReceiver接收一條值為com.example.md.MY_BROADCAST的廣播光戈,所以在一會(huì)發(fā)廣播的時(shí)候得發(fā)一條這樣的廣播
  1. 修改Activity_main.xml中的代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=" send Broadcast"/>
    
</LinearLayout>

  • 定義一個(gè)按鈕作為發(fā)送廣播的觸發(fā)點(diǎn),
  1. 修改MainActivity中的代碼


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 我們自定義的廣播
                Intent intent = new Intent("com.example.md.MY_BROADCAST");
                // 發(fā)送出去
                sendBroadcast(intent);
            }
        });
    }
}


  • 在按鈕點(diǎn)擊事件中遂赠,首先構(gòu)造出Intent對(duì)象,把要發(fā)送的廣播的值傳入晌杰,然后調(diào)用sendBroadcast()方法將廣播發(fā)送出去跷睦,這個(gè)時(shí)候所有監(jiān)聽com.example.md.MY_BROADCAST這條廣播的廣播接收器就會(huì)收到一條消息,此時(shí)發(fā)送的就是標(biāo)準(zhǔn)廣播
    2018-03-18_21-11-45.png

發(fā)送有序廣播

廣播是一種可以跨進(jìn)程的通信肋演,此前在我們程序內(nèi)發(fā)出的廣播抑诸,其他的應(yīng)用也是可以接收到的,再新建一個(gè)項(xiàng)目爹殊,用于接收上面的自定義廣播

  1. 新建AntotherBroadcastReceive

public class AntotherBroadcastReceive extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"received in AntotherBroadcastReceive",Toast.LENGTH_SHORT).show();
         Log.d("aaaaaaaaaa","aaaaaaaaaaaaaa");

    }
}


  • 仍然是在廣播接收器的onReceive()方法中彈出一段文本
  1. 在AndroidManifest.xml中對(duì)這個(gè)廣播進(jìn)行修改
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.md.b2">
    <application
        ...
    
        <receiver
            android:name=".AntotherBroadcastReceive"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <!--這里是我們自定義的廣播-->
                <action android:name="com.example.md.MY_BROADCAST"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

  • 在這個(gè)里面接收的仍然是這個(gè)廣播蜕乡,現(xiàn)在運(yùn)行第二個(gè)項(xiàng)目,把這個(gè)程序安裝到模擬器上梗夸,然后回到第一個(gè)項(xiàng)目的頁面层玲,點(diǎn)擊按鈕,這個(gè)時(shí)候就會(huì)彈出兩個(gè)提示信息(此時(shí)第二項(xiàng)目別關(guān))
    第一次.png

    第二次.png

    2018-03-19_20-04-21.png

    足以說明應(yīng)用發(fā)出的廣播是可以被其他程序接收到的
  1. 發(fā)送有序廣播反症,還是在第一個(gè)項(xiàng)目中辛块,在MainActivity中
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        Button button_1 = (Button)findViewById(R.id.button_1);
        button_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                // 我們自定義的廣播
                Intent intent = new Intent("com.example.md.MY_BROADCAST");
                // 添加進(jìn)來
                //sendBroadcast(intent);
                sendOrderedBroadcast(intent,null);
            }

        });

    }

  • 可以看到,這里只改了一行的代碼將sendBroadcast(intent)改成了sendOrderedBroadcast(intent,null),這個(gè)方法接收兩個(gè)參數(shù)铅碍,第一個(gè)參數(shù)是Intent,第二個(gè)參數(shù)是一個(gè)與權(quán)限相關(guān)的字符串润绵,這里傳入null就可以了,現(xiàn)在重啟程序胞谈,點(diǎn)擊按鈕尘盼,這兩個(gè)應(yīng)用仍然都可以接收到這兩個(gè)廣播
  • 此時(shí)和標(biāo)準(zhǔn)廣播好像沒什么區(qū)別,但是烦绳,這個(gè)時(shí)候廣播接收器是有先后順序的卿捎,而且前面的廣播接收器還可以將這個(gè)廣播進(jìn)行截?cái)啵柚箓鞑?/li>
  • 該怎么定義廣播接收器的先后順序呢爵嗅,是在注冊(cè)的時(shí)候進(jìn)行設(shè)定娇澎,還是在第一個(gè)項(xiàng)目中修改AndroidManifest.xml中的文件
...
 <receiver
            android:name=".MyBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="100">
                <action android:name="com.example.md.MY_BROADCAST"/>
            </intent-filter>
        </receiver>

  • 在這里通過android:priority="100"屬性設(shè)置了廣播接收器的優(yōu)先級(jí),優(yōu)先級(jí)越高就可以先接受到廣播睹晒,這里設(shè)置為100
  • 設(shè)置完優(yōu)先級(jí)趟庄,那么就可以在MyBroadcastReceiver中選擇是否允許攔截這個(gè)廣播的傳遞


public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();
        abortBroadcast();
    }
}

  • 若在onReceive()方法中調(diào)用了abortBroadcast()方法括细,就表示將這個(gè)廣播進(jìn)行攔截,后面的廣播接收器就無法再接收到這條廣播了戚啥,運(yùn)行程序奋单,這個(gè)時(shí)候就只會(huì)彈出一個(gè)信息了

本地廣播

前面使用的發(fā)送和接收的廣播都是系統(tǒng)的全局廣播,就是發(fā)出的和接收的廣播都可以被其他程序接收猫十,這個(gè)時(shí)候安全性就下降了览濒,這個(gè)時(shí)候,我們使用本地廣播拖云,就是
發(fā)出的廣播只能夠在應(yīng)用程序的內(nèi)部使用贷笛,并且廣播接收器也只能接收來自本應(yīng)用內(nèi)部的廣播

  1. 在MainActivity中修改代碼,只要就是使用了LocalBroadcastManager來對(duì)廣播進(jìn)行管理

public class MainActivity extends AppCompatActivity {

    private IntentFilter intentFilter;

    private LocalReceiver localReceiver;
    private LocalBroadcastManager localBroadcastManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        // 獲取實(shí)例
        localBroadcastManager = LocalBroadcastManager.getInstance(this);

        Button button_1 = (Button)findViewById(R.id.button_1);
        button_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 我們自定義的廣播
                Intent intent = new Intent("com.example.md.LOCAL_BROADCAST");
                //發(fā)送自定義廣播
                localBroadcastManager.sendBroadcast(intent);
            }

        });


//        // 創(chuàng)建一個(gè)實(shí)例
        intentFilter = new IntentFilter();
//        // 添加一個(gè)action宙项,
        intentFilter.addAction("com.example.md.LOCAL_BROADCAST");
        localReceiver = new LocalReceiver();
        //注冊(cè)的是本地的廣播接收器
        localBroadcastManager.registerReceiver(localReceiver,intentFilter);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 動(dòng)態(tài)注冊(cè)的廣播需要注冊(cè)
        localBroadcastManager.unregisterReceiver(localReceiver);
    }

    
    class LocalReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context,"received local broadcast",Toast.LENGTH_SHORT).show();
        }
    }

}


  • 這個(gè)和前面所學(xué)的動(dòng)態(tài)注冊(cè)廣播接收器以及發(fā)送廣播的代碼基本相同
  • 首先是通過LocalBroadcastManager.getInstance(this)獲取到它的實(shí)例
  • 注冊(cè)廣播接收器的時(shí)候用的是 localBroadcastManager.registerReceiver()
  • 發(fā)送廣播的時(shí)候調(diào)用的是 localBroadcastManager.sendBroadcast()
    點(diǎn)擊按鈕的時(shí)候就會(huì)發(fā)出com.example.md.LOCAL_BROADCAST廣播乏苦,然后在LocalReceiver里接收這條廣播,點(diǎn)擊程序
    本地廣播.png
  1. 本地廣播是無法通過靜態(tài)注冊(cè)的方式來接收的尤筐,這是因?yàn)殪o態(tài)的注冊(cè)主要就是為了讓程序在沒有啟動(dòng)的情況下也能接收到廣播汇荐,而發(fā)送本地廣播是在程序啟動(dòng)的情況下
  2. 本地廣播的優(yōu)勢(shì)
    • 可以明確的知道正在發(fā)送的廣播是什么,不用擔(dān)心機(jī)密數(shù)據(jù)的泄漏
    • 其他程序的廣播也無法將廣播發(fā)送到我們的程序內(nèi)部盆繁,不用擔(dān)心安全漏洞問題
    • 發(fā)送本地廣播比發(fā)系統(tǒng)廣播效率高
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掀淘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子油昂,更是在濱河造成了極大的恐慌革娄,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秕狰,死亡現(xiàn)場(chǎng)離奇詭異稠腊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鸣哀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門架忌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人我衬,你說我怎么就攤上這事叹放。” “怎么了挠羔?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵井仰,是天一觀的道長。 經(jīng)常有香客問我破加,道長俱恶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮合是,結(jié)果婚禮上了罪,老公的妹妹穿的比我還像新娘。我一直安慰自己聪全,他們只是感情好泊藕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著难礼,像睡著了一般娃圆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛾茉,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天讼呢,我揣著相機(jī)與錄音,去河邊找鬼谦炬。 笑死吝岭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吧寺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼散劫,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼稚机!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起获搏,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤赖条,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后常熙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纬乍,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年裸卫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仿贬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡墓贿,死狀恐怖茧泪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情聋袋,我是刑警寧澤队伟,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站幽勒,受9級(jí)特大地震影響嗜侮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一锈颗、第九天 我趴在偏房一處隱蔽的房頂上張望顷霹。 院中可真熱鬧,春花似錦宜猜、人聲如沸泼返。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绅喉。三九已至,卻和暖如春叫乌,著一層夾襖步出監(jiān)牢的瞬間柴罐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國打工憨奸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留革屠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓排宰,卻偏偏與公主長得像似芝,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子板甘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容