Android使用BroadcastReceiver監聽網路狀態

來源:互聯網
上載者:User

標籤:

在開發中,經常會遇到需要判斷行動電話通訊狀態從而進行各種操作的功能,在這裡簡單介紹下這種功能的實現。

如題,通過BroadcastReceiver我們能在網路狀態改變的時候監聽到它。

那麼,註冊廣播的兩種方式:

1.靜態註冊:在AndroidManifest.xml中用標籤聲明註冊,並在標籤內用標籤設定過濾器。

1234567 <!--繼承BroadcastReceiver,重寫onReceiver方法--><receiver android:name="MyRecevice">    <intent-filter>        <!--  使用過濾器,接收指定action廣播-->        <action android:name="com.dragon.net"></action>    </intent-filter></receiver>

2.動態註冊:

123 IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(String);   //為BroadcastReceiver指定action,使之用於接收同action的廣播registerReceiver(BroadcastReceiver,intentFilter);

在不用的時候需要手動移除

1 unregisterReceiver(BroadcastReceiver);

兩者的區別:

  1. 靜態廣播是常駐型廣播,當關閉程式後如果有廣播資訊發來,程式也會被系統調用自動運行。而動態廣播是跟隨activity生命週期的。

  2. 當廣播為有序廣播時:

    1.優先順序高的先接收。

    2.同優先順序,動態優先於靜態。

  3. 當廣播為普通廣播時無視優先順序,動態優先於靜態

 

我們這次使用動態廣播進行註冊

首先,給項目添加許可權,這個是必須的。很多時候容易忘掉

1234 <!-- 訪問網路許可權 --><uses-permission android:name="android.permission.INTERNET" /><!-- 檢測網路狀態許可權 --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

代碼貼上:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 //檢測網路連接狀態private ConnectivityManager manager; @Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    IntentFilter intentFilter = new IntentFilter();    intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);    registerReceiver(NetworkReceiver, intentFilter);} private BroadcastReceiver NetworkReceiver = new BroadcastReceiver() {    @Override    public void onReceive(Context context, Intent intent) {        if (NetworkAvailable())            NetworkState();        else            Toast.makeText(MainActivity.this"請檢查網路環境", Toast.LENGTH_SHORT).show();    }}; @Overrideprotected void onDestroy() {    super.onDestroy();    unregisterReceiver(NetworkReceiver);} /** * 檢測網路是否串連 */private boolean NetworkAvailable() {    try {        Thread.sleep(600);        //得到網路連接資訊        manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);        if (manager != null) {            // 擷取NetworkInfo對象            NetworkInfo networkInfo = manager.getActiveNetworkInfo();            //去進行判斷網路是否串連            if (networkInfo != null || networkInfo.isAvailable()) {                return true;            }        }    catch (Exception e) {        e.printStackTrace();    }    return false;} /** * 網路已經串連,然後去判斷是wifi串連還是mobile串連 */private void NetworkState() {    NetworkInfo.State mobile = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();    NetworkInfo.State wifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();    if (mobile == NetworkInfo.State.CONNECTED || mobile == NetworkInfo.State.CONNECTING) {        Toast.makeText(this"當前為網路狀態為MOBILE", Toast.LENGTH_SHORT).show();    }    //判斷為wifi狀態下才載入廣告,如果是GPRS行動電話通訊則不載入!    if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING) {        Toast.makeText(this"當前為網路狀態為Wi-Fi", Toast.LENGTH_SHORT).show();    } }

在Wi-Fi狀態切換到MOBILE狀態是會有一段空隙是沒有網路的,所以需要讓程式睡眠0.6秒才能讓程式只顯示MOBILE的Toast,具體時間因手機而定。

Android使用BroadcastReceiver監聽網路狀態

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.