1. 程式人生 > >Android學習筆記(五)廣播(Broadcast)

Android學習筆記(五)廣播(Broadcast)

5. 廣播

5.1 廣播

Android中的廣播主要分為兩種型別:標準廣播有序廣播 標準廣播:         是一種完全非同步執行的廣播,廣播發出後,所有的廣播接收器都會在同一時間內接受這條廣播資訊,無先後順序,效率較高,也意味著無法被截斷。
有序廣播:         則是同步執行的廣播,廣播發出後,同一時刻只有一個廣播接收器能收到,當此廣播接收器邏輯執行完畢後,廣播才會繼續傳遞,有先後順序,效率低,可被截斷

5.2 接收系統廣播

5.2.1 動態註冊監聽網路變化

廣播接收器可自由選擇自己要註冊監聽的廣播,註冊監聽廣播有兩種方式,在程式碼中註冊(動態註冊)和在AndroidManifest.xml中註冊(靜態註冊
)。
1.建立廣播接收器的步驟: (1)新建一個類,繼承自BroadcastReceiver (2)重寫父類的onReceive()方法。 經驗:   實際專案中,不要在onReceive()方法中新增過多的邏輯或耗時的操作,因為在廣播接收器中是不允許開啟執行緒的,當此方法允許較長時間而沒結束時,程式就會報錯,因此廣播接收器更多的是扮演一種開啟程式其他元件的角色,比如建立狀態列通知。 2.動態註冊監聽網路變化例子
public class MainActivity extends AppCompatActivity {
    private IntentFilter intentFilter;

    private NetworkChangeReceiver networkChangeReceiver;

    /**
     * 1.定義了一個內部類,繼承自BroadcastReceiver類,重寫接收到廣播後的執行方法
     */
    class NetworkChangeReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "network changes!", Toast.LENGTH_SHORT).show();
        }
    }

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

        /**
         * 2.建立一個IntentFilter類例項,新增一個值為如下的action(因為當系統網路發生變化時發出的就是此值的廣播)
         */
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        /**
         * 3.建立一個自定義廣播接收器類例項,然後呼叫registerReceiver進行註冊。
         */
        networkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        /**
         * 4.動態註冊的廣播接收器最後都要取消註冊,不管是在哪個方法中
         */
        unregisterReceiver(networkChangeReceiver);
    }
}
優化效果,實現提示當前網路是否可用:
@Override
public void onReceive(Context context, Intent intent) {
    //首先通過getSystemService()方法得到ConnectivityManager的例項,這是系統服務類,專門用於管理網路連線
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    //然後通過它的getActiveNetworkInfo()方法得到NetworkInfo例項
    NetworkInfo network = connectivityManager.getActiveNetworkInfo();
    //最後判斷是否有網路
    if (network != null && network.isAvailable()) {
        Toast.makeText(context, "網路可用", Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(context, "網路不可用", Toast.LENGTH_SHORT).show();
    }
}
注意: Android 系統為了保證應用程式的安全性做了規定,如果程式需要訪問一些系統的關鍵性資訊,必須在配置檔案中宣告許可權才可以,否則程式將會直接崩潰,比如這裡查詢系統的網路狀態就是需要宣告許可權的。 開啟AndroidManifest.xml,加入以下宣告(在manifest節點下):
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

5.2.2 靜態註冊實現開機啟動

動態註冊有自由靈活的優勢,但也有缺點,即必須要在程式啟動後才能接收廣播。 實現開機後程序自動啟動: (1)新建一個廣播接收器類,繼承BroadcastReceiver類,重寫onReceive()方法。 (2)修改AndroidManifest.xml,如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jastar.broadcasttest">

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--通過receiver標籤來靜態註冊廣播接收器-->
        <receiver android:name=".receiver.BootCompleteReceiver">
            <intent-filter>
                <!--在此新增要監聽的廣播action-->
                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
            </intent-filter>
        </receiver>
    </application>

</manifest>

5.3 傳送自定義廣播

5.3.1 傳送標準廣播

Intent intent=new Intent("com.jastar.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);

5.3.2 傳送有序廣播

Intent intent = new Intent("com.jastar.broadcasttest.MY_BROADCAST");
//第一個引數為intent,第二個引數為與許可權有關的字串
sendOrderedBroadcast(intent, null);

在AndroidManifest.xml中配置優先順序:

終止廣播繼續傳遞可在onReceive()方法中新增以下程式碼: abortBroadcast();

5.4 本地廣播

1.系統全域性廣播可被其他任何的應用程式接收到,而本地廣播則只能傳遞在應用程式的內部,從而保證安全問題 2.本地廣播並不複雜,通過LocalBroadcastManager來管理,具體用法跟動態註冊廣播和接收是類似的 (1)獲取LocalBroadcastManager例項 LocalBroadcastManager localManager = LocalBroadcastManager.getInstance(this); (2)傳送本地廣播 localManager.sendBroadcast(intent); //有序廣播 localManager.sendBroadcastSync(intent); (3)註冊接收廣播 //引數1為監聽類,引數2為IntentFilter localManager.registerReceiver(localReceiver,intentFilter); //取消註冊 localManager.unregisterReceiver(localReceiver); 3.本地廣播的優勢 (1)廣播只在應用程式內,不用擔心機密資料洩露 (2)其他程式無法將廣播發送到我們程式內部,不需要擔心安全漏洞的隱患 (3)比傳送全域性廣播更高效


相關推薦

Android學習筆記之百度地圖駕車路線搜尋及RouteOverlay步行路線搜尋及RouteOverlay

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android學習筆記——給Button新增監聽器

方式1:建立成員內部類 //1:建立內部類 class ButtonListener implements OnCickListener{ //重寫OnClick方法 @Override public void onCl

Android學習筆記之百度地圖周邊檢索poiSearchNearBy跳轉頁面並輸出搜尋結果

                package xiaosi.baiduMap;import android.app.AlertDialog;import android.content.DialogInterface;import android.os.Bundle;import com.baidu.map

Android學習筆記】 點選穿透Click Through

問題:開發一個App,主介面用了Activity,子頁面用了Fragment。從Activity跳轉到Fragment後Fragment透明,並且點選擊穿到Axtivity。 分析:剛開始沒有注意到點選擊穿,就是把背景換成不透明的顏色,這時在點選Fragment空白處時才發

Android學習筆記——webview 適配相關不定期更貼填坑

業務需要,會用到android webview相關跳轉H5頁面,開發中發現坑不少,很多東西之前都不知道,想立個彙總帖,之後遇到坑了就來更新一下。     1.webview 自適應手機螢幕大小

【D3D11遊戲程式設計】學習筆記:混合Blending

        (注:【D3D11遊戲程式設計】學習筆記系列由CSDN作者BonChoix所寫,轉載請註明出處:http://blog.csdn.net/BonChoix,謝謝~)        在D3D11中,“混合”發生在畫素著色器階段的下一階段,即Output Me

android學習筆記之多執行緒

這個需要在輸出,點選start後會隔一會輸出一行字,點end會結束輸出。 Code package tk.handleractivity; import android.app.Activity; import android.os.Bundle; import andr

Android學習筆記廣播Broadcast

5. 廣播 5.1 廣播 Android中的廣播主要分為兩種型別:標準廣播和有序廣播。 標準廣播:         是一種完全非同步執行的廣播,廣播發出後,所有的廣播接收器都會在同一時間內接受這條廣

Pro Android學習筆記 感測器5 磁場感測器和方位

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android學習筆記——Activity之間的跳轉

1:使用Intent(意圖)的方式實現Activity跳轉 (1)MainActivity.java: public class MainActivity extends Activity { private Button startOther; @Override pro

Android學習筆記 通知Notification

Notification除了用於後臺服務通知,還常用在下面情況:(1)保持服務存在。當系統記憶體不足時,系統會認為某後臺服務佔用記憶體時間太長而中止該服務,以釋放記憶體。對於某些服務,例如播放音樂,如果系統對該服務進行資源釋放,使用者體驗就成了音樂突然沒有聲音。對這類服務,我們希望享有更高的優先級別,不會被系

Android學習筆記:位置Location

建議更新20130522的ADT版本,無論是Linux下還是Windows下,我覺得速度快了很多。而且將Android SDK Tool升級到ver 22版本後,原來的ADT有很多不明原因問題,載入App到模擬器上出現連線不上的情況。 允許應用具備定位功能 Location是手機功能的一大特色,衛星導航除了

Pro Android學習筆記:感測器7:其他一些感測器

Wei:本來想下面接著的是NFC,NFC是支援讀寫的,和其他感測器在程式設計上很不一樣,但是手頭上找不到支援NFC的手機,記得以前三星Galaxy系列支援,例如幾年前的S3,而國產手機要比較貴的才支援,P6和Z7 mini都不支援,有興趣可以閱讀http://blog.csdn.net/pku_andro

Pro Android學習筆記:ActionBar3:搜尋條

ActionBar中的搜尋條 我們同樣可以在Action Bar中嵌入搜尋條。在小例子中,我們在action bar中嵌入一個搜尋框的widget(稱為search view)。當我們輸入搜尋內容,能夠在指定的activity中開啟(稱為searchable activitiy),本例不做實質的搜尋,只是

Android學習筆記——通過全域性變數傳遞資料

1、全域性物件是Activity之間傳遞資料的一種比較實用的方式,比如在JavaWeb中有四個作用域,這四個作用域從小到大分別是Page、Request、Session和Application,其中Application域在應用程式的任何地方都可以使用和訪問,除非是Web伺

Pro Android學習筆記:使用者介面和控制13:LinearLayout和TableLayout

佈局Layout Layout是容器,用於對所包含的view進行佈局。layout是view的子類,所以可以作為view嵌入到其他的layout中。Android的layout有LinearLayout、TableLayout,RelativeLayout、FrameLayout、GridLayout。 線

Pro Android學習筆記:Dialog2:DialogFragment

DialogFragment的例項newInstance()已經在上一次學習筆記中實現。我們建立dialog的UI,可以通過重寫DialogFragment的兩個函式當中的一個來實現,這兩個函式是onCreateView()和onCreateDialog(),前者返回view,後者返回dialog,如同通過

Pro Android學習筆記一三七:Home Screen Widgets3:配置Activity

map onclick widgets info xtra ces extends height appwidget 文章轉載僅僅能用於非商業性質,且不能帶有虛擬貨幣、積分、註冊等附加條件。轉載須註明出處http://blog.csdn.net/flowingfly

Pro Android學習筆記 ActionBar1:Home圖標區

ces tom 新的 方便 find rac vertica lba manifest ?? Pro Android學習筆記(四八):ActionBar(1):Home圖標區 2013年03月10日 ? 綜合 ? 共 3256字 ? 字號 小 中 大 ? 評論關閉

Linux學習筆記周第一次課3月5日

rpm -ivh yum install yum remove yum update rpm -e 7.1 安裝軟件包的三種方法三種方法rpm工具,安裝會提示依賴其他包,要一個包一個包安裝;yum工具,自動下載安裝依賴包,最容易安裝;源碼包,源代碼,需要編譯器編譯再安裝,最難安裝;7.2