廣播接收器——接收系統廣播

蕭安發表於2019-05-14

一、分類

標準廣播
是一種完全非同步執行的廣播,在廣播發出後,所有的廣播接收器幾乎會在同一時刻接受到這條廣播訊息,沒有任何順序而言。這種廣播效率比較高,但是無法被截斷。
有序廣播
是一種同步執行的廣播,在廣播發出後,同一時刻只會有一個廣播接收器能夠收到這條廣播訊息,當這個廣播接收器中的邏輯執行完畢後,廣播才會繼續傳遞。顯而易見,這類廣播是有先後順序的,優先順序高的廣播接收器就可以先收到廣播訊息,並且前邊的廣播接收器可以截斷正在傳遞的廣播。

二、動態註冊接收系統廣播

就以監聽網路變化為例吧!

步驟

1、宣告網路許可權

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

2、建立一個類NetworkChangeReceiver繼承自BroadcastReceiver。
3、建立一個IntentFilter例項,併為其新增一個值為android.net.conn.CONNECTIVITY_CHANGE的action。
4、建立NetworkChangeReceiver的例項,然後呼叫registerReceiver()方法進行註冊,同時傳入NetworkChangeReceiver的例項和IntentFilter的例項。
5、最後不要忘記取消註冊廣播接收器(因為此廣播接收器為動態註冊的)。

程式碼


package com.henuajy.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private IntentFilter intentFilter;

    private NetworkChangeReceiver netWorkChangeReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        netWorkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(netWorkChangeReceiver,intentFilter);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(netWorkChangeReceiver);
    }

    class NetworkChangeReceiver extends BroadcastReceiver{

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

三、靜態註冊接收系統廣播

仍然以監聽系統網路狀態為例

步驟

1、新建一個類NetworkChangeReceiver,繼承BroadcastReceiver並重寫onReceive()方法;

package com.henuajy.notificationtest;

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

public class NetworkChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //網路狀態發生變化的邏輯
    }
}

2、在配置檔案中的manifest標籤下宣告網路許可權;

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

3、在配置檔案中的application標籤下新增receiver並新增action--“android.net.conn.CONNECTIVITY_CHANGE”;

<receiver
    android:name=".NetworkStateReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
    </intent-filter>
</receiver>

注意

Android系統為了保護使用者裝置的安全和隱私,做了嚴格的規定:如果程式需要進行一些對使用者來書比較敏感的操作,就必須在配置檔案中宣告許可權才可以,否則程式會直接崩潰。比如這裡訪問系統的網路狀態就是需要宣告許可權的。

小補充

如果想要判斷網路狀態是開啟還是關閉,可用下列方法:
1、通過getSystemService()【由於是關於網路狀態的,所以要傳入引數Context.CONNECTIVITY_SERVICE】方法獲取ConnectionManager類的例項manager;
2、通過呼叫manager的getActiveNetworkInfo()方法獲取NetworkInfo類的例項info;
3、通過info的isAvailable()【返回bool值】方法判斷網路是否可用。


ConnectionManager manager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if(info!=null&&info.isAvailable()){
    //網路可用的邏輯
}else{
    //網路不可用的邏輯
}

相關文章