xamarin学习笔记A08(安卓广播)

来源:互联网 发布:淘宝双十一买什么划算 编辑:程序博客网 时间:2024/06/05 19:33

(每次学习一点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

原创粉丝点击