【Delphi】开发Android系统状态感知控件

 

在开发Android系统的时候,我们App需要实时获知系统状态的变化,例如:蓝牙状态的变化(连接、断开)、WIFI状态的变化(打开、关闭)等。为此,专门封装了一个控件类(TReceiver_State),使用该类可以非常方便的在我们的App中感知到系统状态的变化。

目前控件能够感知的Android系统状态包括:蓝牙、WIFI、电源、网络。通过源代码,可以很容易的增加其它的状态变化感知。

控件的使用:

 //1. 创建控件
      FReceiver_State := TReceiver_State.Create;
 //2. 设置需要监听的类别
      FReceiver_State.Receivers = [mtBlueToothState,mtWIFIState,mtPowerState];
  //3. 设置处理事件
      FReceiver_State.OnStateChange := OnStateChange;  //处理事件
  //4. 打开监听
      FReceiver_State.Register_Reveiver(errmsg);
  //5. 关闭监听
       FReceiver_State.UnRegister_Reveiver;

通过控件的Receivers 属性来设置需要感知的消息类别:

//接收消息类型
  TMsgType = (mtBlueToothState,mtWIFIState,mtPowerState,mtNetConnectState);

mtBlueToothState:蓝牙, mtWIFIState:WI-FI, mtPowerState:电源, mtNetConnectState:网络

通过OnStateChange事件来感知系统状态的变化。


//消息记录体
  TmyMSG = record
     msg_TYPE   : TMsgType;   //消息类型
     msg_Content: string;     //消息描述,目前可以不用
     msg_State  : Integer;    //消息实际状态值
  end;

TOnStateChange = procedure(const Sender: TObject; const State : TmyMSG) of object;


OnStateChange(const Sender: TObject; const State : TmyMSG);
       事件参数State说明:
       1. 蓝牙事件  TmyMSG.msg_Content 代表蓝牙状态描述文字
                             TmyMSG.msg_State   代表蓝牙状态字,数字型
                             详细参见:TBlueToothState
       2. WIFI事件  详见:TWIFIState
       3. 电源事件  TmyMSG.msg_Content 返回一个JSON字符串,说明电源情况
                    TmyMSG.msg_State   返回电池的电压 毫伏数
                    电源JSON说明:
                    "level": 80,              //当前电池余量 80%
                    "plugged": "true|false",  //是否正在充电,不区分USB充电还是电源充电
                    "voltage": 4200           //电池电压数,毫伏
       4. 网络事件  TmyMSG.msg_Content 返回一个JSON字符串,说明网络情况
                    TmyMSG.msg_State   返回网络连接类型 0:Mobile  1:WIFI  7:BlueTooth
                    网络JSON说明:
                    "EXTRA_NETWORK_TYPE": "Mobile|WIFI|BlueTooth|Other"), //网络类型
                    "EXTRA_EXTRA_INFO": "ctnet",   //附加信息
                    "EXTRA_NO_CONNECTIVITY": "true|false",   //网络是否没有连接  true 表示网络没有连接,false 表示网络连接

通过Register_Reveiver(errmsg)函数 来打开系统广播消息接收,该函数返回true,表示打开成功,否则表示打开失败,失败的原因是errmsg。

通过UnRegister_Reveiver函数关闭广播消息接收。

原理说明:

通过实现JFMXBroadcastReceiverListener类的onReceive事件来接收系统状态变化消息。

// 接收系统通知消息类
TBroadcastReceiver = class(TJavaLocal, JFMXBroadcastReceiverListener)
  public
    // 实现接收事件
    procedure onReceive(context: JContext; intent: JIntent); cdecl;
  end;

procedure TBroadcastReceiver.onReceive(context: JContext; intent: JIntent);
var
	action,S: String;
  iState: Integer;
  FmyMSG: TmyMSG;
  myMessage : TMessage;
  jo : TJSONObject;
  B : Boolean;
begin
  action := JStringToString( intent.getAction );
  //网络连接广播
                              { 'android.net.conn.CONNECTIVITY_CHANGE'}
  if action = JStringToString(TJConnectivityManager.JavaClass.CONNECTIVITY_ACTION) then
     begin
       iState := intent.getIntExtra( TJConnectivityManager.JavaClass.EXTRA_NETWORK_TYPE,0);
       FmyMSG.msg_State := iState;
       FmyMSG.msg_TYPE  := TMsgType.mtNetConnectState;

       jo := TJSONObject.Create;
       try
         //1、获取网络类型
         iState := intent.getIntExtra( TJConnectivityManager.JavaClass.EXTRA_NETWORK_TYPE,0);
         case iState of
           0 : jo.AddPair('EXTRA_NETWORK_TYPE','Mobile'); //手机流量
           1 : jo.AddPair('EXTRA_NETWORK_TYPE','WIFI');   //WIFI
           7 : jo.AddPair('EXTRA_NETWORK_TYPE','BlueTooth'); //BlueTooth
         else //其它
           jo.AddPair('EXTRA_NETWORK_TYPE','Other');
         end;
         //2、获取网络信息
         S := JStringToString( intent.getStringExtra(TJConnectivityManager.JavaClass.EXTRA_EXTRA_INFO));
         jo.AddPair('EXTRA_EXTRA_INFO',S);
         //3、 EXTRA_NO_CONNECTIVITY
         B := intent.getBooleanExtra(TJConnectivityManager.JavaClass.EXTRA_NO_CONNECTIVITY,false);
         if B then
            jo.AddPair('EXTRA_NO_CONNECTIVITY','true')
         else
            jo.AddPair('EXTRA_NO_CONNECTIVITY','false');
         FmyMSG.msg_Content := jo.ToString;
       finally
         jo.Free;
       end;

       myMessage := TMessage.Create(FmyMSG);
       TMessageManager.DefaultManager.SendMessage(nil,myMessage,True);

       Exit;
     end;
  

  //1. 处理蓝牙广播消息
  if action = JStringToString(TJBluetoothAdapter.JavaClass.ACTION_STATE_CHANGED) then
     begin
       //获取蓝牙状态
       iState := intent.getIntExtra( TJBluetoothAdapter.JavaClass.EXTRA_STATE ,0);
       FmyMSG.msg_State := iState;
       FmyMSG.msg_TYPE := TMsgType.mtBlueToothState;

       case FmyMSG.msg_State of
          2 : FmyMSG.msg_Content := 'STATE_CONNECTED';     //bts_STATE_CONNECTED     2
          1 : FmyMSG.msg_Content := 'STATE_CONNECTING';    //bts_STATE_CONNECTING    1
          0 : FmyMSG.msg_Content := 'STATE_DISCONNECTED';  //bts_STATE_DISCONNECTED  0
          3 : FmyMSG.msg_Content := 'DISCONNECTING';       //bts_STATE_DISCONNECTING 3
          10: FmyMSG.msg_Content := 'STATE_OFF';           //bts_STATE_OFF           10
          12: FmyMSG.msg_Content := 'STATE_ON';            //bts_STATE_ON            12
          13: FmyMSG.msg_Content := 'STATE_TURNING_OFF';   //bts_STATE_TURNING_OFF   13
          11: FmyMSG.msg_Content := 'STATE_TURNING_ON';    //bts_STATE_TURNING_ON    11
        end;

       //通知控件处理此事件
       myMessage := TMessage.Create(FmyMSG);
       TMessageManager.DefaultManager.SendMessage(nil,myMessage,True);

       Exit;
     end;
  //2. 处理WIFI广播消息
  if action = JStringToString(TJWifiManager.JavaClass.WIFI_STATE_CHANGED_ACTION) then
     begin
       //获取WIFI状态
       iState := intent.getIntExtra( TJWifiManager.JavaClass.EXTRA_WIFI_STATE ,0);
       FmyMSG.msg_State := iState;
       FmyMSG.msg_TYPE := TMsgType.mtWIFIState;

       case FmyMSG.msg_State of
          1: FmyMSG.msg_Content := 'WIFI_STATE_DISABLED';   // wfs_WIFI_STATE_DISABLED = 1
          0: FmyMSG.msg_Content := 'WIFI_STATE_DISABLING';  // wfs_WIFI_STATE_DISABLING = 0,
          3: FmyMSG.msg_Content := 'WIFI_STATE_ENABLED';    // wfs_WIFI_STATE_ENABLED = 3,
          2: FmyMSG.msg_Content := 'WIFI_STATE_ENABLING';   // wfs_WIFI_STATE_ENABLING = 2,
          4: FmyMSG.msg_Content := 'WIFI_STATE_UNKNOWN';    // wfs_WIFI_STATE_UNKNOWN = 4
        end;

       //通知控件处理此事件

       myMessage := TMessage.Create(FmyMSG);
       TMessageManager.DefaultManager.SendMessage(nil,myMessage,True);
       Exit;
     end;
  //3. 处理电源变化
   if action = 'android.intent.action.BATTERY_CHANGED' then
      begin
        FmyMSG.msg_TYPE := mtPowerState;
        jo := TJSONObject.Create;
        try
          //获取电源电量 参考:http://www.android-doc.com/reference/android/os/BatteryManager.html#EXTRA_LEVEL
          iState := intent.getIntExtra(StringToJString('level') ,0);
          jo.AddPair('level',iState.ToString);
          //是否插上电源, 0 means it is on battery, other constants are different types of power sources.
          iState := intent.getIntExtra(StringToJString('plugged') ,0);
          if iState <> 0 then
             jo.AddPair('plugged','true')
          else
             jo.AddPair('plugged','false');
          //是否是电池供电
          //iState := intent.getIntExtra(StringToJString('present') ,0);
          //jo.AddPair('present',iState);
          //电池温度
          //iState := intent.getIntExtra(StringToJString('temperature') ,0);
          //jo.AddPair('temperature',iState);

          //电池电压
          iState := intent.getIntExtra(StringToJString('voltage') ,0);
          jo.AddPair('voltage',iState.ToString);

          FmyMSG.msg_Content :=  jo.ToString;
        finally
          jo.Free;
        end;
        iState := intent.getIntExtra(StringToJString('level') ,0);
        FmyMSG.msg_State := iState;

        //通知控件处理此事件
        myMessage := TMessage.Create(FmyMSG);
        TMessageManager.DefaultManager.SendMessage(nil,myMessage,True);
        Exit;
      end;
end;

演示程序APK下载(无需积分下载

控件TReceiver_State源代码及演示程序源代码(包含D10.1和D11版本)下载(需要积分下载,如果你确实没有积分又需要这个控件源代码,请扫描下方微信联系我发给你

【Delphi】开发Android系统状态感知控件_第1张图片

 

你可能感兴趣的:(Android,Delphi,Delphi-Messages,Delphi,android,android,Android,广播消息,Android,电源)