天天看點

Delphi實作Android 廣播事件監聽(動态注冊廣播)Android 下的廣播簡介監聽手機螢幕點亮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:=;
                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’