1. 程式人生 > >Android基礎之廣播

Android基礎之廣播

一、型別

  1. 標準廣播

    完全非同步執行的廣播,所有廣播接收器幾乎都會同時接收到這條廣播訊息

  2. 有序廣播

    同步執行的廣播,廣播接收器有先後順序

二、接收系統廣播

  1. 如何建立一個廣播接收器?

    新建一個類,讓他繼承自BroadcastReceiver,並且重寫父類的onReceive()方法

  2. 動態註冊(在程式碼中註冊—推薦)

    MainActivity.java

    package com.example.lenovo.broadcasttest;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; 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(); //廣播接收器想要監聽什麼廣播,就在這裡新增相應的action
    intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); networkChangeReceiver=new NetworkChangeReceiver(); //呼叫registerReceiver()進行註冊,讓NetworkChangeReceiver收到android.net.conn.CONNECTIVITY_CHANGE的廣播 registerReceiver(networkChangeReceiver,intentFilter); } @Override protected void onDestroy(){ super.onDestroy(); unregisterReceiver(networkChangeReceiver); } //廣播接收器 class NetworkChangeReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ //通過getSystemService()得到ConnectivityManager的例項,這是一個系統類,專門用於管理網路連線 ConnectivityManager connectionManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo=connectionManager.getActiveNetworkInfo();//獲得網路資訊 if(networkInfo!=null&&networkInfo.isAvailable()){ Toast.makeText(context,"network is available",Toast.LENGTH_SHORT).show(); }else { Toast.makeText(context,"network is unavailable",Toast.LENGTH_SHORT).show(); } } } }

    在AndroidManifest.xml中註冊許可權(不註冊會導致崩潰)

        <!-- 申請檢視網路狀態的許可權 -->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

    效果圖: 在這裡插入圖片描述

在這裡插入圖片描述 3. 靜態註冊(在AndroidManifest.xml註冊—不推薦)

  1. 優點:

    在程式未啟動的情況下就能接收廣播

  • 問題原因: Android8.0在AndroidManifest.xml檔案中靜態註冊廣播接收失效是由於官方對耗電量的優化,避免APP濫用廣播的一種處理方式。除了少部分的廣播仍支援靜態註冊(如開機廣播),其餘的都會出現失效的情況。

  • 解決方案:

    儘量使用動態註冊