BroadCast简述

BroadCast(广播):一种在系统内进行通信的机制.通过这种机制,它能够将系统中的某个进程的信息或者意图传递到其他的对这些信息或者意图感兴趣的进程.
广播发送者:想要主动传递自己的信息或者意图给系统或者特定的接收者,以便其作出响应.
广播接收者:想要接收系统或者特定进程的某些信息或意图,以便作出相应的响应.

Android广播机制包含三个基本要素:
广播(Broadcast)----- 用于发送广播。
广播接收器(BroadcastReceiver)----- 用于接收广播。
意图内容(Intent)----- 用于保存广播相关信息的媒介。
广播的过程:
首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用Context.sendBroadcast()、Context.sendOrderBroadcast()或Context.sendstickyBroadcast()方法,把Intent对象以广播的方式发出去。
当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的Intentfilter是否与发送的Intent相匹配,若匹配就会调用BroadcastReceiver的void onReceive(Context curContext, Intent broadcastMsg)方法

广播发送器

sendBroadCast():发送普通广播
可以在同一时刻被所有接收者收到
优点:消息传递效率高
缺点:各个接收者之间无法通信,无法终止消息传播
 sendOrderedBroadCast:发送有序广播
接收者将按预先声明的优先级依次接收广播消息
优先级设置:<intent-filter> android:priority
   (-1000∽1000)数越大级别越高
上一个接收者可往广播中压入数据传递给下一个接收者
任意一个接收者都可终止广播的传播,下一个就不能接收

广播接收器

广播接收器的设计只需两步
继承android.content.BroadcastReceiver类,实现其onReceive(Context context, Intent intent)方法.
在AndroidManifest.xml文件中使用<receiver>标签指定第一步中编写接收类和可以接收的Broadcast Action

演示一个简单的例子,用按钮来发送广播,用toast来提示接受到的广播

第一步:首先编写布局main.xml文件

View Code
 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="vertical"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent"
6 >
7 <Button
8 android:id="@+id/send"
9 android:layout_width="fill_parent"
10 android:layout_height="wrap_content"
11 android:text="发送广播"
12 />
13 </LinearLayout>

第二步:修改BroadCastSendTest01Activity.java文件,用来发送广播:

View Code
 1 package cn.edu.zwu.tel;
2
3 import android.app.Activity;
4 import android.content.Intent;
5 import android.os.Bundle;
6 import android.view.View;
7 import android.view.View.OnClickListener;
8 import android.widget.Button;
9
10 public class BroadCastSendTest01Activity extends Activity {
11 Button send;
12 @Override
13 public void onCreate(Bundle savedInstanceState)
14 {
15 super.onCreate(savedInstanceState);
16 setContentView(R.layout.main);
17 // 获取程序界面中的按钮
18 send = (Button) findViewById(R.id.send);
19 send.setOnClickListener(new OnClickListener()
20 {
21 @Override
22 public void onClick(View v)
23 {
24 // 创建Intent对象
25 Intent intent = new Intent();
26 // 设置Intent的Action属性
27 intent.setAction("cn.edu.zwu.tel.LGS_BROADCAST");
28 intent.putExtra("msg" , "简单的消息");
29 // 发送广播
30 sendBroadcast(intent);
31 }
32 });
33 }
34 }

第三步:添加MyReceiver.java这个文件用来接受广播,并通过toast提示

View Code
 1 package cn.edu.zwu.tel;
2
3 import android.content.BroadcastReceiver;
4 import android.content.Context;
5 import android.content.Intent;
6 import android.widget.Toast;
7
8 public class MyReceiver extends BroadcastReceiver
9 {
10 @Override
11 public void onReceive(Context context, Intent intent)
12 {
13 Toast.makeText(context , "接收到的Intent的Action为:"
14 + intent.getAction()
15 + "\n消息内容是:" + intent.getStringExtra("msg")
16 , 5000)
17 .show();
18 }
19 }

第四步:在AndroidMainFest里添加过滤器,具体代码如下:

View Code
 1 <?xml version="1.0" encoding="utf-8"?>
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="cn.edu.zwu.tel"
4 android:versionCode="1"
5 android:versionName="1.0">
6 <uses-sdk android:minSdkVersion="8" />
7
8 <application android:icon="@drawable/icon" android:label="@string/app_name">
9 <activity android:name=".BroadCastSendTest01Activity"
10 android:label="@string/app_name">
11 <intent-filter>
12 <action android:name="android.intent.action.MAIN" />
13 <category android:name="android.intent.category.LAUNCHER" />
14 </intent-filter>
15 </activity>
16 <receiver android:name=".MyReceiver">
17 <intent-filter>
18 <action android:name="cn.edu.zwu.tel.LGS_BROADCAST" />
19 </intent-filter>
20 </receiver>
21 </application>
22 </manifest>

效果图:

第二个例子是开机自动启动应用程序,这个比较简单,实际上,android开机会发出一个Android.intent.action.BOOT_COMPLETED广播信息。我们只要从Broadcast Receiver

派生出一个新类用来接受action,这样就能在Receiver中打开自定义的程序了。

关键代码给大家看一下就可以了

首先在AndroidMainFest里添加过滤器

View Code
1 <receiver android:name=".MyReceiver">
2 <intent-filter>
3 <action android:name="android.intent.action.BOOT_COMPLETED" />
4 <category android:name="android.intent.category.HOME" />
5 </intent-filter>
6
7 </receiver>

主程序不用改,只要编写MyReceiver这个类继承BroadcastReceiver,具体代码如下:

View Code
 1 package cn.edu.zwu.tel;
2 import android.content.BroadcastReceiver;
3 import android.content.Context;
4 import android.content.Intent;
5 import android.widget.Toast;
6
7 public class MyReceiver extends BroadcastReceiver
8 {
9 @Override
10 public void onReceive(Context context, Intent intent)
11 {
12 Intent mainIntent = new Intent(context, BroadCastReceTest01Activity.class);
13 //系统会检查当前所有已创建的Task中是否有该要启动的Activity的Task,
14 //若有,则在该Task上创建Activity,若没有则新建具有该Activity属性的Task,
15 //并在该新建的Task上创建Activity
16 mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
17 context.startActivity(mainIntent);
18
19 }
20 }






 

原文地址:https://www.cnblogs.com/shaoyangjiang/p/2379489.html