Android教程:Android Broadcast Receiver
本教程讨论了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"); }