xamarin學習筆記A08(安卓廣播)

(每次學習一點xamarin就做個學習筆記和視頻來加深記憶鞏固知識)
如有不正確的地方,請幫我指正。
廣播簡介
廣播用於在組件之間進行通信。
可用於App與Android系統之間通信。
可用於App與App之間通信。
可用於App內部不同組件之間通信。
廣播分爲兩類:標準廣播和有序廣播。
標準廣播發出之後,所有廣播接收器幾乎在同一時間接收到。有序廣播在同一時間只有一個接收器才能收到,第一個接收器的邏輯執行完後廣播可以繼續傳到下一下接收器。接收器有優先級,優先級高的先收到廣播。

系統廣播
Android系統有很多內置的廣播。例如開機完成後會發送一條廣播,還有網絡開啓或關閉後也會發送一條廣播,還有電量變化等等。
怎樣接收廣播呢,第一步:新建一個類,繼承自BroadcastReceiver,然後重寫OnReceive方法。第二步:如果需要權限,則在AndroidManifest.xml文件中聲明所需的權限。
下面是一個接收系統啓動後的廣播接收器的代碼:

/*
     Enabled = true表示啓用這個廣播接收器
     Exported = true表示可以接收本程序之外的廣播
     Intent.ActionBootCompleted表示安卓系統啓動完成後的廣播
     [IntentFilter(new string[] { Intent.ActionBootCompleted })]表示這個類是收聽系統啓動後發出的廣播
     以上代碼會在AndroidManifest.xml文件的application這個節點內生成如下代碼:
     <receiver
        android:name=".BootCompletedReceiver"
        android:enabled="true"
        android:exported="true"
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
     </receiver>
     */
    [BroadcastReceiver(Enabled = true, Exported = true)]
    [IntentFilter(new string[] { Intent.ActionBootCompleted })]
    public class BootCompletedReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            Toast.MakeText(context, "收到開機完成的廣播", ToastLength.Long).Show();
        }
}

在AndroidManifest.xml文件中聲明瞭權限:

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

在AndroidManifest文件中生成receiver節點來註冊廣播接收器的方式稱爲靜態註冊方式,這種方式的好處是不需要啓動程序,也可以收到廣播。
下面是動態註冊廣播接收器的代碼。
首先新建一個網絡狀態變化的廣播接收器

//網絡狀態變化的廣播接收器
    public class NetChangedReceiver : BroadcastReceiver
    {
        public ConnectivityManager ConnectivityManager { get; set; }

        public override void OnReceive(Context context, Intent intent)
        {
            NetworkInfo networkInfo = ConnectivityManager.ActiveNetworkInfo;
            if(networkInfo!=null && networkInfo.IsAvailable)
                Toast.MakeText(context, "網絡狀態有效", ToastLength.Short).Show();
            else
                Toast.MakeText(context, "網絡狀態無效", ToastLength.Short).Show();
        }
}

然後在AndroidManifest.xml文件中聲明所需權限:

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

最後在MainActivity中實現相關代碼:

public class MainActivity : AppCompatActivity
    {
        private IntentFilter m_IntentFilter;
        private NetChangedReceiver m_NetChangedReceiver;

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView (Resource.Layout.Main);

            m_IntentFilter = new IntentFilter();
            m_IntentFilter.AddAction("android.net.conn.CONNECTIVITY_CHANGE");//收聽網絡狀態變化的廣播

            m_NetChangedReceiver = new NetChangedReceiver();
            m_NetChangedReceiver.ConnectivityManager = this.GetSystemService(Context.ConnectivityService) as ConnectivityManager;

            this.RegisterReceiver(m_NetChangedReceiver, m_IntentFilter);//註冊廣播接收器

        }

        protected override void OnDestroy()
        {
            base.OnDestroy();
            this.UnregisterReceiver(m_NetChangedReceiver); //解除NetChangedReceiver廣播接收器的註冊
        }
    }

動態註冊的廣播接收器要記得取消註冊。

自定義廣播
發送自定義廣播又分發送全局廣播和發送本地廣播。 全局廣播可以被其它應用程序接收到,而本地廣播只能在應用程序內部傳遞。
舉個例子,貼上MainActivity中的部分代碼:

public void OnClick(View v)
        {
            Intent intent;
            switch (v.Id)
            {
                case Resource.Id.button1:
                    intent = new Intent("com.abc.A08.Msg_Broadcast");
                    intent.PutExtra("s", "明天放假");
                    this.SendBroadcast(intent);//發送全局標準廣播
                    //this.SendOrderedBroadcast(intent, null);//發送全局有序廣播 
                    break;
                case Resource.Id.button2:
                    intent = new Intent("com.abc.A08.Hello_Broadcast");
                    m_LocalBroadcastManager.SendBroadcast(intent);//發送本地廣播
                    break;
            }
}

private LocalBroadcastManager m_LocalBroadcastManager;
protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView (Resource.Layout.Main);

            m_LocalBroadcastManager = LocalBroadcastManager.GetInstance(this);
  }
protected override void OnDestroy()
        {
            base.OnDestroy();
            m_LocalBroadcastManager.UnregisterReceiver(m_HelloReceiver);//解除com.abc.A08.Hello_Broadcast廣播接收器的註冊
        }

從上面的代碼可以看出,發送廣播是用的Intent對象,”com.abc.A08.Msg_Broadcast”是自定義的廣播名稱, “明天放假”是要廣播出去的文本內容,然後通過SendBroadcast方法發送全局標準廣播,或者通過SendOrderedBroadcast發送全局有序廣播。使用LocalBroadcastManager的實例的SendBroadcast方法來發送本地廣播。

完整代碼和視頻在我上傳的CSDN資源中http://download.csdn.net/download/junshangshui/9926948

發佈了74 篇原創文章 · 獲贊 50 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章