在开发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版本)下载(需要积分下载,如果你确实没有积分又需要这个控件源代码,请扫描下方微信联系我发给你)