Android教程:Android Broadcast Receiver

时间:2020-02-23 14:28:42  来源:igfitidea点击:

本教程讨论了Android系统的另一个非常重要的组件:Android Broadcast Receiver。

什么是Android广播接收器?

广播接收器是Android系统的休眠组件。
只有一个Intent(已为其注册)可以将其付诸实践。
万一发生特定事件,广播接收器的工作就是将通知传递给用户。

使用广播接收器,应用程序可以注册特定事件。
一旦事件发生,系统将通知所有已注册的应用程序。

例如,广播接收器会触发我们在移动屏幕上看到的电池电量低通知。

由广播接收器引起的其他实例是Facebook应用上的新朋友通知,新朋友供稿,新消息等。

实际上,我们经常会看到广播接收机在工作。
诸如传入消息,WiFi已激活/已禁用消息之类的通知等都是关于Android系统和应用程序中发生的事情的实时公告。

考虑一下:

我们将参加重要的社交聚会。
由于记忆不佳,我们已要求朋友在活动开始前一天通知我们。
现在,由于我们已经"注册"了所述朋友的帮助,因此我们将如前所述从他那里得到提醒。
这大致就是广播接收器的工作方式。

正确实施广播接收器有多重要?

如果我们想创建一个好的Android应用程序,那么这是至关重要的。
如果广播事件不能很好地完成其工作(发送通知以支持应用程序的主要任务),则该应用程序将不直观且用户友好。

广播接收者注册

有两种注册广播接收器的方法:一个是静态的,另一个是动态的。

1)静态:在列表文件中使用<receiver>标记。
(AndroidManifest.xml)

2)动态:使用Context.registerReceiver()方法动态注册一个实例。

广播类别

广播的两个主要类别是:

1)有序广播:这些广播是同步的,因此遵循特定的顺序。
顺序是使用android:priority属性定义的。
具有更高优先级的接收器将首先接收广播。
如果存在具有相同优先级的接收器,则广播将不遵循命令。
每个接收器(当接收到广播时)可以将通知传递给下一个通知,也可以完全中止广播。
中止时,通知将不会传递给下一行的接收者。

2)常规广播:常规广播不是有序的。
因此,注册的接收器通常同时运行。
这非常有效,但是接收方无法利用结果。

有时,为避免系统过载,即使在正常广播的情况下,系统也会一次传送一个广播。
但是,接收方仍然无法使用结果。

活动意图和广播意图之间的区别

我们必须记住,广播意图与用于启动活动或者服务的意图不同(在先前的Android教程中已有讨论)。
用于启动活动的意图会更改与用户进行交互的操作,因此用户会意识到该过程。
但是,在广播意图的情况下,该操作完全在后台运行,因此对用户不可见。

实施广播接收器

我们需要按照以下步骤来实现广播接收器:

1)创建Android的BroadcastReceiver的子类

2)实现onReceive()方法:为了发送通知,必须实现onReceive()方法。
每当发生注册接收者的事件时,就会调用onReceive()。
例如,在电池电量不足通知的情况下,接收器将注册到Intent.ACTION_BATTERY_LOW事件。
一旦电池电量低于定义的电量,就会调用此onReceive()方法。

以下是onReceive()方法的两个参数:

  • Context 上下文:用于访问其他信息或者启动服务或者活动。

  • Intent:意图对象用于注册接收者。

安全

由于广播接收器具有全局工作空间,因此安全性在这里非常重要。
如果我们没有为注册的接收方定义限制和过滤器,则其他应用程序可能会滥用它们。
以下一些限制可能会有所帮助:

  • 每当我们在应用程序的列表中发布接收方时,请使用android:export =" false"使其对外部应用程序不可用。我们可能会认为,在发布接收方时指定Intent过滤器将为我们完成任务,但实际上这还不够。

  • 发送广播时,外部应用程序也有可能接收它们。可以通过指定一些限制来防止这种情况。

  • 同样,当我们使用registerReceiver注册接收器时,任何应用程序都可以广播它。也可以使用权限来防止这种情况。

(PS:从Android 3.1开始,Android系统将不会收到任何外部Intent,因此该系统现在相对安全。
)

长时间作业

广播接收器对象仅在onReceive(上下文,意图)期间有效。
因此,如果需要在接收到通知后允许采取措施,则应触发通知服务,而不是广播接收者。

  • 要显示对话,则应使用NotificationManager API

  • 如果我们希望发送即使在广播完成后仍然存在的广播意图,则必须使用sendStickyBroadcast(Intent)方法。

广播接收器示例

在此示例应用程序中,当我们更改系统时间时会生成一条通知。
单击该通知会将用户引导至联系人。
该应用程序的工作方式如下:

示例代码

这是此广播接收器的示例代码:

public class MyBroadcastReceiver extends BroadcastReceiver {
	private NotificationManager mNotificationManager;
	private int SIMPLE_NOTFICATION_ID;
	@Override
	public void onReceive(Context context, Intent intent) {
		mNotificationManager = (NotificationManager) context
				.getSystemService(Context.NOTIFICATION_SERVICE);
		Notification notifyDetails = new Notification(R.drawable.android,
				"Time Reset!", System.currentTimeMillis());
		PendingIntent myIntent = PendingIntent.getActivity(context, 0,
				new Intent(Intent.ACTION_VIEW, People.CONTENT_URI), 0);
		notifyDetails.setLatestEventInfo(context, "Time has been Reset",
				"Click on me to view Contacts", myIntent);
		notifyDetails.flags |= Notification.FLAG_AUTO_CANCEL;
		notifyDetails.flags |= Notification.DEFAULT_SOUND;
		mNotificationManager.notify(SIMPLE_NOTFICATION_ID, notifyDetails);
		Log.i("hisham_debug", "Sucessfully Changed Time");
	}