Android 下的广播简介
在Android下,很多事件需要使用到系统下的广播。例如:你想知道手机电量的变化、是否安装了一个新的程序应用包、扩展介质被移除等信息时。Android广播分为两个方面:广播发送者和广播接收者,通常情况下BroadcastReceiver指的是广播接收者(广播接收器)。
要使广播生效必须先注册广播,实现注册就是告诉系统:要监听什么广播,和监听到之后要做什么动作完成什么工作(自定义广播重写onReceive)。
注册广播
注册广播有两种方式:
1、动态注册(在代码中注册):
通过代码手工注册。当程序关闭时,该接收器也会随之销毁。当然,也可手工调用unregisterReceiver()进行销毁。动态注册必须在程序运行状态下才能接收广播。
2、静态注册(在AndroiMainfest.xml中配置):
Android不能自动销毁该类广播接收器,也就是说当应用程序关闭后,还是会接收广播。
本文主要讲解动态注册,静态注册可参考:《Delphi XE开发 Android 开机自动启动》
请注意,某些应用(或功能)只能使用静态注册方式。
重写onReceive方法
当我们完成广播的注册后,需要重写onReceive方法中去实现事件发生后的处理过程(本例仅发送一个本地通知)。
监听手机屏幕点亮
源码Demo请下载:http://download.csdn.net/detail/tanqth/9891016
该源码事例仅做了手机屏幕点亮的测试,大家可以根据这个代码完成自己需要的实用功能。
主要代码展示
1、建立广播处理类
TScanBroadcastReceiver = class(TJavaLocal, JFMXBroadcastReceiverListener)
public
// 重写广播接收事件
procedure onReceive(context: JContext; intent: JIntent); cdecl;
end;
1
2
3
4
5
2、广播接收后的处理
// 广播接收
procedure TScanBroadcastReceiver.onReceive(context: JContext; intent: JIntent);
var
action: String;
MyNotification: TNotification;
begin
action := JStringToString(intent.getAction);
// 判断广播事件
if action = RES_ACTION then
begin
if not Form2.Visible then Form2.Show;
TThread.Synchronize(nil,
procedure
begin
Form2.Memo1.Lines.Add(‘内容:屏幕点亮’);
end);
//实现本地通知
//本地通知详细技术可查看 http://blog.csdn.net/tanqth/article/details/73739313 【文章】
//或 https://item.taobao.com/item.htm?id=536584650957 【代码】
MyNotification := Form2.NotificationCenter1.CreateNotification;
try
MyNotification.Name := ‘新通知’;
MyNotification.Title := ‘屏幕点亮’;
MyNotification.AlertBody :=‘TEST’;
MyNotification.Number:=18;
Form2.NotificationCenter1.PresentNotification(MyNotification);
finally
MyNotification.Free;
end;
end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
动态注册
// 创建接收者
FListener := TScanBroadcastReceiver.Create();
if not Assigned(FListener) then
Exit;
FReceiver := TJFMXBroadcastReceiver.JavaClass.init(FListener);
if not Assigned(FReceiver) then
Exit;
// 通知意图过滤器
FFilter := TJIntentFilter.JavaClass.init(StringToJString(RES_ACTION));
if not Assigned(FFilter) then
Exit;
FFilter.addAction(StringToJString(RES_ACTION));
FFilter.addCategory(StringToJString('android.intent.category.DEFAULT'));
// 动态注册广播接受者
SharedActivityContext.registerReceiver(FReceiver, FFilter);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Android 广播事件
以下是收集整理的Android广播事件关键字。有了他,你可以随意监听你需要的广播信息。
充电状态,或者电池的电量发生变化。
‘android.intent.action.BATTERY_CHANGED’
在系统启动后。这个动作被广播一次(只有一次)。
‘android.intent.action.BOOT_COMPLETED’
语音电话的呼叫转移状态已经改变。
‘android.intent.action.CFF’
设备的配置信息已经改变,
‘android.intent.action.CONFIGURATION_CHANGED’
电话的数据活动(data activity)状态(即收发数据的状态)已经改变。
‘android.intent.action.DATA_ACTIVITY’
电话的数据连接状态已经改变。
‘android.intent.action.DATA_STATE’
日期被改变。
‘android.intent.action.DATE_CHANGED’
取消所有被挂起的 (pending) 更新下载。
‘android.server.checkin.FOTA_CANCEL’
更新已经被确认,马上就要开始安装。
‘android.server.checkin.FOTA_INSTALL’
更新已经被下载。可以开始安装。
‘android.server.checkin.FOTA_READY’
恢复已经停止的更新下载。
‘android.server.checkin.FOTA_RESTART’
通过 OTA 下载并安装操作系统更新。
‘android.server.checkin.FOTA_UPDATE’
用户按下了’Media Button’。
‘android.intent.action.MEDIABUTTON’
扩展介质(扩展卡)已经从 SD 卡插槽拔出,但是挂载点 (mount point) 还没解除 (unmount)。
‘android.intent.action.MEDIA_BAD_REMOVAL’
用户想要移除扩展介质(拔掉扩展卡)。
‘android.intent.action.MEDIA_EJECT’
扩展介质被插入,而且已经被挂载。
‘android.intent.action.MEDIA_MOUNTED’
扩展介质被移除。
‘android.intent.action.MEDIA_REMOVED’
已经扫描完介质的一个目录。
‘android.intent.action.MEDIA_SCANNER_FINISHED’
开始扫描介质的一个目录。
‘android.intent.action.MEDIA_SCANNER_STARTED’
扩展介质的挂载被解除 (unmount)。
因为它已经作为 USB 大容量存储被共享。
‘android.intent.action.MEDIA_SHARED’
扩展介质存在,但是还没有被挂载 (mount)。
‘android.intent.action.MEDIA_UNMOUNTED’
电话的消息等待(语音邮件)状态已经改变。
‘android.intent.action.MWI’
设备收到了新的网络 ‘tickle’ 通知。
‘android.intent.action.NETWORK_TICKLE_RECEIVED’
设备上新安装了一个应用程序包。
‘android.intent.action.PACKAGE_ADDED’
设备上删除了一个应用程序包。
‘android.intent.action.PACKAGE_REMOVED’
电话状态已经改变。
‘android.intent.action.PHONE_STATE’
更新将要(真正)被安装。
‘android.intent.action.PROVIDER_CHANGED’
要求 polling of provisioning service 下载最新的设置。
‘android.intent.action.PROVISIONING_CHECK’
屏幕被关闭。
‘android.intent.action.SCREEN_OFF’
屏幕已经被打开。
‘android.intent.action.SCREEN_ON’
电话服务的状态已经改变。
‘android.intent.action.SERVICE_STATE’
电话的信号强度已经改变。
‘android.intent.action.SIG_STR’
要求 receivers 报告自己的统计信息。
‘android.intent.action.STATISTICS_REPORT’
统计信息服务的状态已经改变。
‘android.intent.action.STATISTICS_STATE_CHANGED’
时区已经改变。
‘android.intent.action.TIMEZONE_CHANGED’
时间已经改变(重新设置)。
‘android.intent.action.TIME_SET’
当前时间已经变化(正常的时间流逝)。
‘android.intent.action.TIME_TICK’
设备进入 USB 大容量存储模式。
‘android.intent.action.UMS_CONNECTED’
设备从 USB 大容量存储模式退出。
‘android.intent.action.UMS_DISCONNECTED’
系统的墙纸已经改变。
‘android.intent.action.WALLPAPER_CHANGED’
XMPP 连接已经被建立。
‘android.intent.action.XMPP_CONNECTED’
XMPP 连接已经被断开。
‘android.intent.action.XMPP_DI’