本教程讨论了Android系统的另一个非常重要的组件:Android Broadcast Receiver。
广播接收器是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"
);
}
原文链接:https://codingdict.com/