Delphi实现Android 广播事件监听(动态注册广播)

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;

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;

动态注册

  // 创建接收者
    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);

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’

发布了20 篇原创文章 · 获赞 29 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/tanqth/article/details/74612507