android四大組件之廣播BroadcastReceiver

廣播最為android的四大組件之一,地位可想而知,它有一個很好的功能就是能一直監(jiān)聽著消息的帶來,而期間不會消耗資源。一步一步跟著來

新建ExampleBroadcastReceiver

 package com.nb.picaudio;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
 * Created by niebin on 2017/3/17.
 */
public class ExampleBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    }
}

注冊

廣播的注冊分為兩種,靜態(tài)注冊和動態(tài)注冊。
靜態(tài)注冊就是在manifest.xml中注冊
動態(tài)注冊就是在java代碼中實現(xiàn)注冊

靜態(tài)注冊

在AndroidManifest.xml文件中插入代碼

<receiver  android:name="com.nb.picaudio.ExampleBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.ExampleBroadcastReceiver">
                </action>
            </intent-filter>
</receiver>

動態(tài)注冊

java文件中寫入,保證代碼要在發(fā)送廣播之前執(zhí)行就行,一般選擇在activity的onCreate()方法中注冊

ExampleBroadcastReceiver receiver = new ExampleBroadcastReceiver();  
IntentFilter filter = new IntentFilter();  
filter.addAction("android.intent.action.ExampleBroadcastReceiver");  
registerReceiver(receiver, filter); 

記得使用完注銷

 unregisterReceiver(receiver);  

發(fā)送消息到廣播

public void send(View view) {  
    Intent intent = new Intent("android.intent.action.ExampleBroadcastReceiver"); 
    intent.putExtra("message", "hello world");  
    sendBroadcast(intent);  
}  

至此,廣播的簡單應(yīng)用就講完了,那我們還需要了解什么呢
廣播最主要的功能就是監(jiān)聽,特別是系統(tǒng)的各種狀態(tài)改變,都會發(fā)廣播出來以action的形式
如果你開發(fā)時需要關(guān)心相關(guān)狀態(tài),這時候下面的內(nèi)容就派上用處了

<action android:name="android.intent.action.BOOT_COMPLETED" />

系統(tǒng)狀態(tài)

開機(jī)狀態(tài)

<action android:name="android.intent.action.BOOT_COMPLETED"/> 

那注冊只要添加上去就行了‘’

<receiver  android:name="com.nb.picaudio.ExampleBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.ExampleBroadcastReceiver">
           <action android:name="android.intent.action.BOOT_COMPLETED">
                </action>
            </intent-filter>
</receiver>

看沒 很簡單 只是在原來的基礎(chǔ)上添加就可以了
只是在接受的時候有了區(qū)別,參照 新建廣播,這里只多了if語句部分

package com.nb.picaudio;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
 * Created by niebin on 2017/3/17.
 */
public class ExampleBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
       String action=intent.getAction();
        if(action.equals("android.intent.action.BOOT_COMPLETED")){
            //開機(jī)廣播
        }else if(action.equals("android.intent.action.ExampleBroadcastReceiver")){
            //自己發(fā)送的廣播
        }
    }
}

系統(tǒng)廣播,自己不用執(zhí)行發(fā)送消息動作,系統(tǒng)會在合適的機(jī)會發(fā)送,開發(fā)者只需要接受就好了
其他系統(tǒng)廣播的action列一下

其他廣播

不用完全記住,大致了解下,知道這么一回事,可以先收藏 ,用到的時候查

Intent.ACTION_AIRPLANE_MODE_CHANGED; //關(guān)閉或打開飛行模式時的廣播

Intent.ACTION_BATTERY_CHANGED; //充電狀態(tài),或者電池的電量發(fā)生變化
//電池的充電狀態(tài)、電荷級別改變,不能通過組建聲明接收這個廣播,只有通過Context.registerReceiver()注冊

Intent.ACTION_BATTERY_LOW;  //表示電池電量低

Intent.ACTION_BATTERY_OKAY; //表示電池電量充足,即從電池電量低變化到飽滿時會發(fā)出廣播

Intent.ACTION_BOOT_COMPLETED;   //在系統(tǒng)啟動完成后,這個動作被廣播一次(只有一次)。

Intent.ACTION_CAMERA_BUTTON;    //按下照相時的拍照按鍵(硬件按鍵)時發(fā)出的廣播

Intent.ACTION_CLOSE_SYSTEM_DIALOGS; //當(dāng)屏幕超時進(jìn)行鎖屏?xí)r,當(dāng)用戶按下電源按鈕,長按或短按(不管有沒跳出話框),進(jìn)行鎖屏?xí)r,android系統(tǒng)都會廣播此Action消息

Intent.ACTION_CONFIGURATION_CHANGED;    //設(shè)備當(dāng)前設(shè)置被改變時發(fā)出的廣播(包括的改變:界面語言,設(shè)備方向,等,請參考Configuration.java)

Intent.ACTION_DATE_CHANGED; //設(shè)備日期發(fā)生改變時會發(fā)出此廣播

Intent.ACTION_DEVICE_STORAGE_LOW;   //設(shè)備內(nèi)存不足時發(fā)出的廣播,此廣播只能由系統(tǒng)使用,其它APP不可用?

Intent.ACTION_DEVICE_STORAGE_OK;    //設(shè)備內(nèi)存從不足到充足時發(fā)出的廣播,此廣播只能由系統(tǒng)使用,其它APP不可用?

Intent.ACTION_DOCK_EVENT;   //發(fā)出此廣播的地方frameworks\base\services\java\com\android\server\DockObserver.java

Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE;  //移動APP完成之后,發(fā)出的廣播(移動是指:APP2SD)

Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;    //正在移動APP時,發(fā)出的廣播(移動是指:APP2SD)

Intent.ACTION_GTALK_SERVICE_CONNECTED;  //Gtalk已建立連接時發(fā)出的廣播

Intent.ACTION_GTALK_SERVICE_DISCONNECTED;   //Gtalk已斷開連接時發(fā)出的廣播

Intent.ACTION_HEADSET_PLUG; //在耳機(jī)口上插入耳機(jī)時發(fā)出的廣播

Intent.ACTION_INPUT_METHOD_CHANGED; //改變輸入法時發(fā)出的廣播

Intent.ACTION_LOCALE_CHANGED;   //設(shè)備當(dāng)前區(qū)域設(shè)置已更改時發(fā)出的廣播

Intent.ACTION_MANAGE_PACKAGE_STORAGE;
//

Intent.ACTION_MEDIA_BAD_REMOVAL;    //未正確移除SD卡(正確移除SD卡的方法:設(shè)置--SD卡和設(shè)備內(nèi)存--卸載SD卡),但已把SD卡取出來時發(fā)出的廣播
//廣播:擴(kuò)展介質(zhì)(擴(kuò)展卡)已經(jīng)從 SD 卡插槽拔出,但是掛載點 (mount point) 還沒解除 (unmount)

Intent.ACTION_MEDIA_BUTTON; //按下"Media Button" 按鍵時發(fā)出的廣播,假如有"Media Button" 按鍵的話(硬件按鍵)

Intent.ACTION_MEDIA_CHECKING;   //插入外部儲存裝置,比如SD卡時,系統(tǒng)會檢驗SD卡,此時發(fā)出的廣播?
Intent.ACTION_MEDIA_EJECT;  //已拔掉外部大容量儲存設(shè)備發(fā)出的廣播(比如SD卡,或移動硬盤),不管有沒有正確卸載都會發(fā)出此廣播?
//廣播:用戶想要移除擴(kuò)展介質(zhì)(拔掉擴(kuò)展卡)。
Intent.ACTION_MEDIA_MOUNTED;    //插入SD卡并且已正確安裝(識別)時發(fā)出的廣播
//廣播:擴(kuò)展介質(zhì)被插入,而且已經(jīng)被掛載。
Intent.ACTION_MEDIA_NOFS;

Intent.ACTION_MEDIA_REMOVED;    //外部儲存設(shè)備已被移除,不管有沒正確卸載,都會發(fā)出此廣播?
// 廣播:擴(kuò)展介質(zhì)被移除。
Intent.ACTION_MEDIA_SCANNER_FINISHED;   //廣播:已經(jīng)掃描完介質(zhì)的一個目錄
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE;
//
Intent.ACTION_MEDIA_SCANNER_STARTED;    //廣播:開始掃描介質(zhì)的一個目錄

Intent.ACTION_MEDIA_SHARED; // 廣播:擴(kuò)展介質(zhì)的掛載被解除 (unmount),因為它已經(jīng)作為 USB 大容量存儲被共享。
Intent.ACTION_MEDIA_UNMOUNTABLE;
//
Intent.ACTION_MEDIA_UNMOUNTED   // 廣播:擴(kuò)展介質(zhì)存在,但是還沒有被掛載 (mount)。
Intent.ACTION_NEW_OUTGOING_CALL;

Intent.ACTION_PACKAGE_ADDED;    //成功的安裝APK之后
//廣播:設(shè)備上新安裝了一個應(yīng)用程序包。
//一個新應(yīng)用包已經(jīng)安裝在設(shè)備上,數(shù)據(jù)包括包名(最新安裝的包程序不能接收到這個廣播)
Intent.ACTION_PACKAGE_CHANGED;  //一個已存在的應(yīng)用程序包已經(jīng)改變,包括包名
Intent.ACTION_PACKAGE_DATA_CLEARED;
//清除一個應(yīng)用程序的數(shù)據(jù)時發(fā)出的廣播(在設(shè)置--應(yīng)用管理--選中某個應(yīng)用,之后點清除數(shù)據(jù)時?)
//用戶已經(jīng)清除一個包的數(shù)據(jù),包括包名(清除包程序不能接收到這個廣播)

Intent.ACTION_PACKAGE_INSTALL;  //觸發(fā)一個下載并且完成安裝時發(fā)出的廣播,比如在電子市場里下載應(yīng)用?
Intent.ACTION_PACKAGE_REMOVED;
//成功的刪除某個APK之后發(fā)出的廣播
//一個已存在的應(yīng)用程序包已經(jīng)從設(shè)備上移除,包括包名(正在被安裝的包程序不能接收到這個廣播)

Intent.ACTION_PACKAGE_REPLACED; //替換一個現(xiàn)有的安裝包時發(fā)出的廣播(不管現(xiàn)在安裝的APP比之前的新還是舊,都會發(fā)出此廣播?)
Intent.ACTION_PACKAGE_RESTARTED; //用戶重新開始一個包,包的所有進(jìn)程將被殺死,所有與其聯(lián)系的運行時間狀態(tài)應(yīng)該被移除,包括包名(重新開始包程序不能接收到這個廣播)
Intent.ACTION_POWER_CONNECTED;  //插上外部電源時發(fā)出的廣播
Intent.ACTION_POWER_DISCONNECTED;   //已斷開外部電源連接時發(fā)出的廣播
Intent.ACTION_PROVIDER_CHANGED;
//

Intent.ACTION_REBOOT;   //重啟設(shè)備時的廣播

Intent.ACTION_SCREEN_OFF;   //屏幕被關(guān)閉之后的廣播

Intent.ACTION_SCREEN_ON;    //屏幕被打開之后的廣播

Intent.ACTION_SHUTDOWN; //關(guān)閉系統(tǒng)時發(fā)出的廣播

Intent.ACTION_TIMEZONE_CHANGED; //時區(qū)發(fā)生改變時發(fā)出的廣播

Intent.ACTION_TIME_CHANGED; //時間被設(shè)置時發(fā)出的廣播

Intent.ACTION_TIME_TICK;
//廣播:當(dāng)前時間已經(jīng)變化(正常的時間流逝)。
//當(dāng)前時間改變,每分鐘都發(fā)送,不能通過組件聲明來接收,只有通過Context.registerReceiver()方法來注冊

Intent.ACTION_UID_REMOVED; //一個用戶ID已經(jīng)從系統(tǒng)中移除發(fā)出的廣播

Intent.ACTION_UMS_CONNECTED;    //設(shè)備已進(jìn)入USB大容量儲存狀態(tài)時發(fā)出的廣播?

Intent.ACTION_UMS_DISCONNECTED; //設(shè)備已從USB大容量儲存狀態(tài)轉(zhuǎn)為正常狀態(tài)時發(fā)出的廣播?

Intent.ACTION_USER_PRESENT;

Intent.ACTION_WALLPAPER_CHANGED;    //設(shè)備墻紙已改變時發(fā)出的廣播

謝謝大家的支持

這是一篇技術(shù)整理,結(jié)合自己的理解,不懂的也查查網(wǎng)絡(luò),主要是讓自己的理解更加清晰,如果對大家有利我也感到更加高興!最后謝謝大家的支持!

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

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

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