【Android】15.2 广播

分类:C#、Android、VS2015;

创建日期:2016-02-29

一、简介

Android系统和你自己编写的应用程序都可以通过Indent发送和接收广播信息。广播的内容既可以是自定义的信息,也可以是Android的系统信息。例如,网络连接变化、电池电量变化、系统设置变化、接收到新的短信、微信、……等。

1、发送广播消息

一般都是通过后台服务中向前台发送广播消息。当然,也可以在某个Activity中向其他的Activity发送广播,不过,这种情况很少见。

要通过服务发送广播,可先定义一个继承自Service的子类,例如:

[Service]

public class MyService : Service

{

……

}

在该服务子类中,重写StartCommandResult()方法,然后在该方法中创建一个Intent实例,同时还可以调用这个Intent实例的PutExtra()方法包含要发送的附加消息(可选),最后调用SendBroadcast()方法,即可将该消息广播出去。例如:

intent = new Intent(action);

intent.PutExtra("message", "这是来自广播的消息");

SendBroadcast(intent);

注意:

(a)用Intent发送广播时,必须在参数中使用“全局唯一的标识符”指定该Intent要执行的动作,总之,你只要确保这个Action名称在整个项目中是唯一的就行了。

在实际应用中,动作字符串一般用“解决方案名+项目名+动作名”来表示,例如:

public static readonly string action = "MyBroadcastDemo.action1";

也可以用“自定义的命名空间+动作名”来表示。例如:

public static readonly string action = "www.cnblogs.com.rainmj.MyBroadcastDemo";

但是,这些都是一些约定的大家觉得比较好的做法,并不是必须这样做。换言之,唯一的要求就是不要在同一个项目中有相同的Action名称就行,这就是“全局唯一的标识符”的含义。

(b)由于发送广播一般都是通过后台服务来实现的,为了不让后台服务影响前台的界面操作,可以通过Task或者Thread来发送(见示例)。当然,如果服务用时很短,比如仅发送一个简单的字符串,那就没有必要用Task或者Thread来实现了。

发送广播的完整代码见示例中的ch1501Service.cs文件。

2、接收广播消息

对于广播接收端来说,凡是注册了BroadcastReceiver的应用程序类,都可以从继承自BroadcastReceiver的类中接收到广播消息,这个实现接收广播的BroadcastReceiver子类就叫广播接收器。

广播接收器(Broadcast Receivers)接收的广播内容一般来自Android内置的标准服务,另外,还可以来自你自己定义的服务。

例如:

public class MyBroadcastReceiver : BroadcastReceiver

{

……

}

广播接收器一旦启动,就会自动监听你注册的广播,并在OnReceive()方法中接收广播消息。因此,要正常接收广播,必须在该子类中重写OnReceive()方法,例如:

public override void OnReceive(Context context, Intent intent)

{

……

}

默认情况下,Android要求OnReceive方法必须在5秒内执行完毕,否则Android会认为该组件失去响应,并提示用户强行关闭该组件。

接收广播的完整代码见示例中的ch1501BroadcastReceiver.cs文件。

3、注册接收的广播地址

一般在Activity中注册要用哪个广播接收器来接收广播。

有两种注册接收广播地址的方式,一种是通过C#代码实现(常用),另一种是在配置文件AndroidManifest.xml中实现(不常用)。

通过C#代码实现的办法示例如下:

var receiver = new MyBroadcastReceiver();

RegisterReceiver(receiver, new IntentFilter(MyService.action));

StartService(new Intent(this, typeof(MyService)));

这段代码注册一个BroadcastReceiver,并通过IntentFilter(Intent过滤器)指定要执行的动作,然后就可以调用StartService()方法启动广播服务。

调用RegisterReceiver()后,系统就会自动在配置文件(AndroidManifest.xml)中配置Intent过滤器,不需要我们自己在这个文件中去手动配置。

二、示例1运行截图

本示例演示如何定时发送多种类型的广播。通过这个例子,相信你应该能真正理解“要发送的动作(Action)”的含义,同时也应该能明白如何在一个接收器中通过Intent过滤器注册多个动作。

该例子提前使用了下一章将要介绍的Android Service的功能。

三、主要设计步骤

1、添加ch1501_Main.axml文件

在Resource/layout文件夹下添加该文件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button
        android:id="@+id/ch1501_btnStart"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="启动服务(发送广播)" />
    <Button
        android:id="@+id/ch1501_btnStop"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="停止服务(停止广播)" />
    <TextView
        android:text=""
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView1"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="50dp" />
</LinearLayout>

2、添加ch1501Service文件

在SrcDemos文件夹下添加该文件,模板选择【Class】。

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using System;
using System.Threading.Tasks;

namespace MyDemos.SrcDemos
{
    [Service]
    public class ch1501Service : Service
    {
        public const string action1 = "www.cnblogs.com.rainmj.ch1501Service";
        public const string action2 = "MyDemos.ch1501Service.Info1";
        public const string action3 = "MyDemos.ch1501Service.Info2";
        public const string action4 = "MyDemos.ch1501Service.Info3";
        public static bool IsCancel;

        [return: GeneratedEnum]
        public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
        {
            //一般应根据不同的情况通过action发送不同的广播信息,
            //如果仅发送一条广播,像下面这样直接发送即可,不需要用Task.Run实现
            //intent = new Intent(action1);
            //SendBroadcast(intent);

            //如果是长时间运行的后台服务,为了不影响界面操作,最好用
            //线程来实现,比如发送后台处理的进度等。
            //下面以每隔1秒随机选取一个action为例,来演示长时间运行
            //的服务以及定时向前台发送不同类型广播的办法
            Task.Run(async () =>
            {
                Random r = new Random();
                string[] actions = { action1, action2, action3, action4 };
                string action = actions[0];
                while (true)
                {
                    if (IsCancel == true)
                    {
                        break;
                    }
                    intent = new Intent(action);
                    SendBroadcast(intent);
                    action = actions[r.Next(actions.Length)];
                    await Task.Delay(1000);
                }
            });
            return StartCommandResult.Sticky;
        }

        public override IBinder OnBind(Intent intent)
        {
            return null;
        }
    }
}

3、添加ch1501BroadcastReceiver.cs文件

在SrcDemos文件夹下添加该文件,模板选择【Class】。

using Android.Content;
using Android.Widget;

namespace MyDemos.SrcDemos
{
    public class ch1501BroadcastReceiver : BroadcastReceiver
    {
        private TextView txt;
        public ch1501BroadcastReceiver(ch1501MainActivity activity)
        {
            txt = activity.FindViewById<TextView>(Resource.Id.textView1);
        }

        public override void OnReceive(Context context, Intent intent)
        {
            //此处应该对接收到的intent.Action分别进行处理
            //为简单起见,例子仅将这个字符串在界面上显示出来了
            txt.Text += "\n收到:" + intent.Action;
        }
    }
}

4、添加ch1501MainActivity.cs文件

在SrcDemos文件夹下添加该文件,模板选择【Activity】。

using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget;

namespace MyDemos.SrcDemos
{
    [Activity(Label = "【例15-1】广播基本用法")]
    public class ch1501MainActivity : Activity
    {
        private ch1501BroadcastReceiver receiver;
        private Intent intent;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.ch1501_Main);
            var txt = FindViewById<TextView>(Resource.Id.textView1);

            IntentFilter intentFilter = new IntentFilter();
            intentFilter.AddAction(ch1501Service.action1);
            intentFilter.AddAction(ch1501Service.action2);
            intentFilter.AddAction(ch1501Service.action3);
            intentFilter.AddAction(ch1501Service.action4);
            receiver = new ch1501BroadcastReceiver(this);
            RegisterReceiver(receiver, intentFilter);

            intent = new Intent(this, typeof(ch1501Service));
            var btnStart = FindViewById<Button>(Resource.Id.ch1501_btnStart);
            btnStart.Click += delegate
            {
                txt.Text = "";
                ch1501Service.IsCancel = false;
                StartService(intent);
            };
            var btnStop = FindViewById<Button>(Resource.Id.ch1501_btnStop);
            btnStop.Click += delegate
            {
                ch1501Service.IsCancel = true;
                StopService(intent);
            };
        }

        protected override void OnDestroy()
        {
            UnregisterReceiver(receiver);
            ch1501Service.IsCancel = true;
            StopService(intent);
            base.OnDestroy();
        }
    }
}
时间: 2024-10-11 21:31:06

【Android】15.2 广播的相关文章

【Android】15.0 第15章 广播和通知&mdash;本章示例主界面

分类:C#.Android.VS2015: 创建日期:2016-02-28 一.简介 广播(Broadcast):其功能类似于收音机的广播,你只要调到那个台(只要在接收的类中注册了要接收的广播),就能收到这个台播放的信息. 通知(Notifications):安卓的服务组件(Android Service,后面章节再细讲)本来是在后台运行的,可是,用户可能希望关注某个后台任务当前正在执行的状态或者结果,此时就可以利用"通知"在前台告诉用户. 二.本章示例主界面 1.运行截图 这个截图也

Android之旅---广播(BroadCast)

什么是广播 在Android中.Broadcast是一种广泛运用的在应用程序之间传输信息的机制. 我们拿广播电台来做个例如. 我们寻常使用收音机收音是这种:许很多多不同的广播电台通过特定的频率来发送他们的内容.而我们用户仅仅须要将频率调成和广播电台的一样就能够收听他们的内容了.Android中的广播机制就和这个差点儿相同的道理. 电台发送的内容是语音,而在Android中我们要发送的广播内容是一个Intent.这个Intent中能够携带我们要传送的数据. 电台通过大功率的发射器发送内容,而在An

Android之旅---广播(BroadCast)[转]

本文转自 http://www.cnblogs.com/qianlifeng/archive/2011/03/06/1972305.html 什么是广播 在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制.我们拿广播电台来做个比方.我们平常使用收音机收音是这样的:许许多多不同的广播电台通过特定的频率来发送他们的内容,而我们用户只需要将频率调成和广播电台的一样就可以收听他们的内容了.Android中的广播机制就和这个差不多的道理. 电台发送的内容是语音,而在Andr

Android开发之广播

广播是Android开发中的一个重要的功能,在Android里面有各式各样的广播,比如:电池的状态变化.信号的强弱状态.电话的接听和短信的接收等等,现在给大家简单介绍一下系统发送.监听这些广播的机制. Android中的广播机制基本如下: 那广播在Android程序中到底是如何运行的呢?现在我给大家以代码的形式好好分析一下: 一.发送广播 Intent是Activity中发送广播的桥梁,通过他我们可以轻松的将广播发送到系统中,具体的实现如下: final String Intent_Action

Android 常见的广播 action常量

Intent.ACTION_AIRPLANE_MODE_CHANGED; //关闭或打开飞行模式时的广播 Intent.ACTION_BATTERY_CHANGED; //充电状态,或者电池的电量发生变化 //电池的充电状态.电荷级别改变,不能通过组建声明接收这个广播,只有通过Context.registerReceiver()注册 Intent.ACTION_BATTERY_LOW; //表示电池电量低 Intent.ACTION_BATTERY_OKAY; //表示电池电量充足,即从电池电量

[Android]三种广播接收器1

/************ 动态注册 ************/ ActivityMain.java  package home.lee.broadcastreceiver; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.Inten

Android入门:广播发送者与广播接收者

参考: Android入门:广播发送者与广播接收者 - xiazdong - CSDN博客http://blog.csdn.net/xiazdong/article/details/7768807 一.广播发送者&广播接收者介绍 1.广播接收者 广播接收者简单地说就是接收广播意图的Java类,此Java类继承BroadcastReceiver类,重写: public void onReceive(Context context,Intent intent),其中intent可以获得传递的数据:

Android Socket 发送广播包的那些坑

Socket广播包经常被用于局域网内的两台设备之间互相发现和消息传递,在Android应用开发过程中,也经常会遇到这样的需求,例如:两台Android设备之间.Android与手环等智能硬件之间.Android与Windows电脑之间等等. 本文主要介绍在Android中使用Socket开发广播包程序时需要注意的编程事项,以及解决方法. 首先给出一段Android发送广播包的示例代码: DatagramSocket socket = new DatagramSocket(8000); socke

Android笔记(二十六) Android中的广播——BroadcastReceiver

什么是广播? 为了方便进行系统级别的消息通知,Android有一套类似广播的消息机制,每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收自己所关心的广播内容,这些广播可能是来自于系统,也可能是来自于其他程序. 广播可以分为两种类型:有序广播和标准广播 标准广播是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因为它们之间没有任何先后顺序可言,这种广播的效率会比较高,但同时也意味着它是无法被截断的 如上图所示,每个人都代表一个广播接收器

android 发送UDP广播,搜寻服务器建立socket链接

应用场景:客户端(手机,pc)需要搜寻所在局域网内的服务器并获得服务器地址. 方法简介:客户端发送UDP广播,服务收到广播后得到客户端ip地址,然后向客户端发送一次socket链接,客户端收到socket链接,获得服务器地址. 相关知识: UPD.TCP.TCP是面向链接的,可靠的通信方式.UDP是面向非链接的通讯方式.TCP的建立比较麻烦,要经过"三次握手".而UDP的建立比较简单,发送方只管把内容发送出去,不管接收方是否收到.UDP的传输分为:单播,多播,广播.其中,多播和广播是通