`
wayfarer
  • 浏览: 297656 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Broadcast Receiver

阅读更多

Broadcast Receiver用于接收并处理广播通知(broadcast announcements)。多数的广播是系统发起的,如地域变换、电量不足、来电来信等。程序也可以播放一个广播。程序可以有任意数量的 broadcast receivers来响应它觉得重要的通知。broadcast receiver可以通过多种方式通知用户:启动activity、使用NotificationManager、开启背景灯、振动设备、播放声音等,最 典型的是在状态栏显示一个图标,这样用户就可以点它打开看通知内容。

通常我们的某个应用或系统本身在某些事件(电池电量不足、来电来短信)来临时会广播一个Intent出去,我们可以利用注册一个Broadcast Receiver来监听到这些Intent并获取Intent中的数据。

 

1. 我们自己的程序主动广播Intent

final String BROADCAST = "com.forrest.action.mybroadcast";
Intent intent = new Intent(BROADCAST); // 对应setAction()
intent.putExtra("data_title", "来短信啦");
intent.putExtra("data_text", "美女你好,晚上可有空");
sendBroadcast(intent);

 

2.接收广播

接收broadcast需要注册一个Broadcast Receiver,并且要注册一个Intent Filter来制定Broadcase Receiver是对哪些Intent进行监听。

(1)注册Broadcast Receiver

一个Broadcast receiver只有一个简单的回调函数:onReceive(Context curContext, Intent broadcastMsg),当一个广播消息被Receiver监听到时,Android会调用它的onReceive()方法,并将包含消息的Intent对象传给它。onReceive中代码的执行时间不要超过5s,否则android会弹出超时dialog。 此时是否另开一个线程来处理耗时的操作呢?

Receiver只在onReceive方法执行时是激活状态,只要onReceive一返回,Receiver就不再是激活状态了。Receiver进程是被一个激活状态的broadcast receiver所保护而不被系统终止的,一旦onReceive返回,Receiver进程broadcast receiver所保护而变为一个空进程,空进程是可以在任意时刻被终止的。这就带来了一个问题:当响应一个广播信息的处理十分耗时的时候,那么就应该把这个处理放在一个单独的线程里去执行,来保证主线程里的其他用户交互组件能够继续运行,而一旦这么做,当onReceive()唤起一个线程后就会马上返回,这时就会把Receiver进程放到被终止的境地。解决这个问题的方案是在onReceive()里开始一个Service,让这个Service去做这件事情,那么系统就会认为这个进程里还有活动正在进行。

(2)注册/注销Broadcast Receiver

1)在AndroidManifest.xml中注册

<receiver android:name="Receiver1">
	<intent-filter>
               <!-- 和Intent中的action对应 -->
		<action android:name="com.forrest.action.mybroadcast"/>
	</intent-filter>
</receiver>

 2)在代码中注册

IntentFilter filter = new IntentFilter("com.forrest.action.mybroadcast"); // 和广播中Intent的action对应
MyBroadcastReceiver br = new MyBroadcastReceiver();
registerReceiver(new MyBroadcastReceiver(), filter);

 3)注销

unregisterReceiver(br);

 

3. 示例代码

public class Receiver1 extends BroadcastReceiver {
	private Context context;
	public static final int NOTIFICATION_ID = 10001;
	
	public void onReceive(Context context, Intent intent) {
		this.context = context;
		showNotification();
	}
	
	private void showNotification() {
		Notification notification = new Notification(R.drawable.icon, "来电话啦...", System.currentTimeMillis());
		PendingIntent contentIntent = PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), 0);
		notification.setLatestEventInfo(context, "来电话啦...嘿嘿", "赶紧接电话,否则误大事了", contentIntent);
		
		NotificationManager notificationManager = (NotificationManager) context.getSystemService(
				android.content.Context.NOTIFICATION_SERVICE);
		notificationManager.notify(NOTIFICATION_ID, notification);
	}
}
 
public class Receiver2 extends BroadcastReceiver {
	private Context context;
	
	@Override
	public void onReceive(Context context, Intent intent) {
		this.context = context;
		deleteNotification();
	}
	
	private void deleteNotification() {
		NotificationManager notificationManager = (NotificationManager) context.getSystemService(android.content.Context.NOTIFICATION_SERVICE);
		notificationManager.cancel(Receiver1.NOTIFICATION_ID);
	}
}
 
public class MainActivity extends Activity {
	private final String ACTION_SEND = "com.forrest.action.SENDMESSAGE",
						 ACTION_CLEAR = "com.forrest.action.CLEARNOTIFICATION";
	
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ( (Button) findViewById(R.id.btn1) ).setOnClickListener(new OnClickListener() {
        	public void onClick(View v) {
        		clickMenuItem(ACTION_SEND);
        	}
        });
        ( (Button) findViewById(R.id.btn2) ).setOnClickListener(new OnClickListener() {
        	public void onClick(View v) {
        		clickMenuItem(ACTION_CLEAR);
        	}
        });
    }
    
    private void clickMenuItem(final String action) {
    	Intent intent = new Intent(action);
    	sendBroadcast(intent);
    }
}

 注册Broadcast Reciver

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".MainActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <receiver android:name="Receiver1">
    	<intent-filter>
    		<action android:name="com.forrest.action.SENDMESSAGE"/>
    	</intent-filter>
    </receiver>
    <receiver android:name="Receiver2">
    	<intent-filter>
    		<action android:name="com.forrest.action.CLEARNOTIFICATION"/>
    	</intent-filter>
    </receiver>
</application>

 

4.

分享到:
评论
4 楼 ccsosnfs 2012-03-12  
感谢楼主,我在receiver里用handler post一个线程,线程超过5秒也不可以。
后来同事用启动service解决了。
在你这里我找到原因。多谢。
3 楼 marine8888 2010-12-10  
请问:
<action android:name="com.forrest.action.SENDMESSAGE"/> 
这个里面的名字是自己取的,还是系统提供的啊?
2 楼 时培峰 2010-11-11  
谢楼主分享
1 楼 azhqiang 2010-09-06  
LZ,我想请问下。你改的那些XML文件,都是在哪个目录下的?

相关推荐

    四大组件 Activity Service content provider broadcast receiver

    ### 四大组件详解:Activity、Service、Content Provider与Broadcast Receiver #### 一、Activity **定义:** Activity是Android应用程序中的四大基本组件之一,它代表一个屏幕界面,用户可以直接与其进行交互。每...

    利用广播Broadcast Receiver,在2个不同的Activity传递数据

    通过创建BroadcastReceiver,注册它,发送Broadcast,以及在接收端处理数据,我们可以轻松地在两个不同的Activity之间传递信息。注意,为了优化资源使用,记得在适当的时候注销BroadcastReceiver。

    Broadcast Receiver Demo

    在Android开发中,四大组件是Activity、Service、Content Provider以及我们这里关注的Broadcast Receiver(广播接收器)。Broadcast Receiver是Android系统中的一个重要组成部分,它允许应用程序在后台接收并响应...

    Android新手Broadcast Receiver简单实现

    本教程将引导Android新手一步步实现Broadcast Receiver。 首先,我们需要创建一个新的BroadcastReceiver类。在Android Studio中,可以在项目结构中选择“New” -&gt; “Java Class”,然后命名为“MyBroadcastReceiver...

    广播接受者(Broadcast Receiver)

    广播接收者(Broadcast Receiver)是Android系统中的一个重要组件,它允许应用程序在后台接收并响应系统或应用程序广播事件。广播事件可以是系统级别的,如设备启动、网络状态改变,也可以是应用自定义的,用于在...

    android的Broadcast Receiver应用机制

    ### Android的Broadcast Receiver应用机制 #### 一、BroadcastReceiver简介 在Android开发中,四大核心组件包括:Activity、Service、BroadcastReceiver以及Content Provider。其中,BroadcastReceiver是一种特殊...

    第八章_Android广播事件处理Broadcast_Receiver

    ### 第八章 Android广播事件处理Broadcast Receiver #### 知识点一:理解Broadcast Receiver的作用与意义 在Android应用开发过程中,Broadcast Receiver是一种重要的组件,它主要用于接收来自系统或其他应用程序...

    本示例 利用Broadcast Receiver 启动Service

    &lt;receiver android:name=".StartupBroadcastReceiver"&gt; &lt;/receiver&gt; ``` 3. 发送广播:在适当的时候,例如应用程序启动时,发送一个带有“com.example.START_SERVICE”动作的广播,触发BroadcastReceiver。 ...

    android-simple-broadcast-receiver-app:简单的Android Broadcast Receiver使用示例

    在Android开发中,Broadcast Receiver(广播接收者)是四大组件之一,它负责监听系统或应用程序发送的广播消息,并在接收到这些消息时执行相应的操作。本项目“android-simple-broadcast-receiver-app”提供了一个...

    Android课程设计-记事本(Activity,Service,Broadcast Receiver,Provider)实现

    1:使用手机号码和密码进行注册 2:使用注册信息进行登录 3:可以查看自己的记事本记录信息 4:可以添加记事本内容信息 5:可以对记事本信息进行修改和删除 6:可以查看自己的信息以及修改密码

    Android四大组件之Broadcast Receiver

    文章目录Android四大组件之Broadcast Receiver概述广播接收器(Broadcast Receiver)Broadcast Receiver简介Broadcast Receiver的注册一. 静态注册二. 动态注册三. 本地广播发送Broadcast Receiver广播的三种发送...

    Android开发应用中Broadcast Receiver组件详解

    下面就具体介绍一下Broadcast Receiver组件的用法。 下面是Android Doc中关于BroadcastReceiver的概述: ①广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的──比如,...

    android broadcast的使用

    Broadcast Receiver(广播接收者)是Android四大组件之一,专门用来接收并响应系统或自定义广播事件。本教程将深入探讨Android广播的使用,适合初学者入门。 首先,我们需要了解Broadcast Receiver的基本概念。...

    时间计时器

    【时间计时器】是一款基于Android Studio开发的应用,它整合了Broadcast Receiver(广播接收者)和服务(Service)等核心组件,以实现精准的时间管理功能。在Android应用开发中,理解和掌握这些知识点至关重要,因为...

    Android 学习(26)Intent 分类

    本篇文章将深入探讨Intent的分类及其在Android应用中的作用,同时也会提及Broadcast Receiver,它是Android系统中处理全局广播的重要组件。 首先,我们来看Intent的两大分类:显式Intent和隐式Intent。 1. **显式...

    android broadcast实例

    Broadcast Receiver(广播接收者)是Android四大组件之一,用于接收系统或应用发出的广播意图(Intent)。本实例将深入探讨如何在Android中使用`sendBroadcast`, `sendOrderedBroadcast`以及`sendStickyBroadcast`三...

    testBOOT_COMPLETED如何在开机时即启动程序

    在Android系统中,`testBOOT_COMPLETED` 是一个广播接收器(Broadcast Receiver)的自定义动作,用于在设备完成启动后触发特定的程序或服务。这个主题涉及到Android应用程序生命周期管理、广播接收器以及系统启动...

    Broadcast_Receiver_Example

    Broadcast_Receiver_Example 是一个基于Android平台的项目,主要展示了如何使用Broadcast Receiver这一核心组件。Broadcast Receiver(广播接收器)是Android四大组件之一,用于接收系统或应用广播事件,即使应用在...

    Android学习之Broadcast练习_dlc

    Broadcast Receiver(广播接收者)是Android系统中用于在应用程序之间传递消息的一种机制。它允许应用在后台接收和响应系统或其它应用发送的广播事件,即使应用并未运行。本实践项目"Android学习之Broadcast练习_dlc...

    delphi XE android 开机启动代码

    这个过程涉及到Android系统的广播接收器(Broadcast Receiver)和特定的权限设置。以下是对这个主题的详细解释: 1. **Broadcast Receiver**: 在Android系统中,Broadcast Receiver是一种组件,它能监听并响应...

Global site tag (gtag.js) - Google Analytics