(每次學習一點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