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’