1. 程式人生 > >Delphi實現Android 廣播事件監聽(動態註冊廣播)

Delphi實現Android 廣播事件監聽(動態註冊廣播)

Android 下的廣播簡介

在Android下,很多事件需要使用到系統下的廣播。例如:你想知道手機電量的變化、是否安裝了一個新的程式應用包、擴充套件介質被移除等資訊時。Android廣播分為兩個方面:廣播發送者和廣播接收者,通常情況下BroadcastReceiver指的是廣播接收者(廣播接收器)。
要使廣播生效必須先註冊廣播,實現註冊就是告訴系統:要監聽什麼廣播,和監聽到之後要做什麼動作完成什麼工作(自定義廣播重寫onReceive)。

註冊廣播

註冊廣播有兩種方式:
1、動態註冊(在程式碼中註冊):
通過程式碼手工註冊。當程式關閉時,該接收器也會隨之銷燬。當然,也可手工呼叫unregisterReceiver()進行銷燬。動態註冊必須在程式執行狀態下才能接收廣播。
2、靜態註冊(在AndroiMainfest.xml中配置):


Android不能自動銷燬該類廣播接收器,也就是說當應用程式關閉後,還是會接收廣播。

本文主要講解動態註冊,靜態註冊可參考:《Delphi XE開發 Android 開機自動啟動
請注意,某些應用(或功能)只能使用靜態註冊方式。

重寫onReceive方法

當我們完成廣播的註冊後,需要重寫onReceive方法中去實現事件發生後的處理過程(本例僅傳送一個本地通知)。

監聽手機螢幕點亮

主要程式碼展示

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’