delphi xe 10 [开发交流] 网络变化通知

下文转自:

http://www.dfwlt.com/forum.php?mod=viewthread&tid=2026&extra=page%3D4%26filter%3Dsortid%26sortid%3D3

unit NetStatusInfo;

interface

uses Androidapi.JNIBridge, Androidapi.JNI.Embarcadero, Androidapi.JNI.GraphicsContentViewText,
  Androidapi.Helpers, Androidapi.JNI.Net;

type
  TNetworkChangedEvent = procedure (Action: string) of object;
  TBroadcastReceiverEvent = procedure (context: JContext; intent: JIntent) of object;

  TNetworkChangeReceiver = class(TJavaLocal, JFMXBroadcastReceiverListener)
  private
    FOnBroadcastReceiverEvent: TBroadcastReceiverEvent;
  public
    property OnBroadcastReceiverEvent: TBroadcastReceiverEvent read FOnBroadcastReceiverEvent write FOnBroadcastReceiverEvent;
    procedure onReceive(context: JContext; intent: JIntent); cdecl;
  end;

  TNetStatusInfo = class
  private
    FNetworkChangedEvent: TNetworkChangedEvent;
    procedure FireNetworkChangedEvent(Action: string);
    procedure InitClass;
  protected
    FConnectivityManager: JConnectivityManager;
    FListener: TNetworkChangeReceiver;
    FReceiver: JFMXBroadcastReceiver;
    FFilter: JIntentFilter;
    FCurrentNetName: string;
    procedure OnNetworkChangedEvent(context: JContext; intent: JIntent);
  public
    constructor Create(NetworkChangedEvent: TNetworkChangedEvent);
    destructor Destroy; override;
    function IsWifi: Boolean;
    function IsMobile: Boolean;

    property CurrentNetName: string read FCurrentNetName;
  end;

implementation

uses Androidapi.JNI.JavaTypes, System.SysUtils;

const
  NET_STATUS_RECEIVER = 'com.android.net.status.receiver';
  NET_WIFI = 'WIFI';
  NET_MOBILE = 'MOBILE';
  NET_UNKNOWN = 'UNKNOWN';


  { TNetBroadcastReceiverListener }

procedure TNetworkChangeReceiver.onReceive(context: JContext; intent: JIntent);
begin
  // 这里可以加入一些过滤处理
  if Assigned(FOnBroadcastReceiverEvent) then
    FOnBroadcastReceiverEvent(context, intent);
end;

{ TNetStatusInfo }

constructor TNetStatusInfo.Create(NetworkChangedEvent: TNetworkChangedEvent);
begin
  inherited Create;

  FNetworkChangedEvent := NetworkChangedEvent;
  InitClass;

  if IsWifi then begin
    FCurrentNetName := NET_WIFI;
  end else if IsMobile then begin
    FCurrentNetName := NET_MOBILE;
  end else begin
    FCurrentNetName := NET_UNKNOWN;
  end;
end;

destructor TNetStatusInfo.Destroy;
begin
  TAndroidHelper.context.unregisterReceiver(FReceiver);
  inherited;
end;

procedure TNetStatusInfo.FireNetworkChangedEvent(Action: string);
begin
  if (CompareStr(FCurrentNetName, Action) <> 0) and Assigned(FNetworkChangedEvent) then begin
    FCurrentNetName := Action;
    FNetworkChangedEvent(Action);
  end;
end;

procedure TNetStatusInfo.InitClass;
var
  ConnectivityServiceNative: JObject;
begin
  if not Assigned(FConnectivityManager) then
  begin
    ConnectivityServiceNative := TAndroidHelper.context.getSystemService(TJContext.JavaClass.CONNECTIVITY_SERVICE);
    if not Assigned(ConnectivityServiceNative) then begin
      Exit;
    end;

    FConnectivityManager := TJConnectivityManager.Wrap((ConnectivityServiceNative as ILocalObject).GetObjectID);
    if not Assigned(FConnectivityManager) then begin
      Exit;
    end;

    FListener := TNetworkChangeReceiver.Create;
    FListener.OnBroadcastReceiverEvent := OnNetworkChangedEvent;

    FReceiver := TJFMXBroadcastReceiver.JavaClass.init(FListener);
    if not Assigned(FReceiver) then begin
      Exit;
    end;

    FFilter := TJIntentFilter.JavaClass.init(StringToJString(NET_STATUS_RECEIVER));
    if not Assigned(FFilter) then begin
      Exit;
    end;

    FFilter.addAction(StringToJString('android.net.conn.CONNECTIVITY_CHANGE'));
    FFilter.addCategory(StringToJString('android.intent.category.DEFAULT'));

    TAndroidHelper.context.registerReceiver(FReceiver, FFilter);
  end;
end;

function TNetStatusInfo.IsMobile: Boolean;
var
  Mobile: JNetworkInfo;
begin
  if Assigned(FConnectivityManager) then begin
    Mobile := FConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_MOBILE);
    if Assigned(Mobile) then begin
      Exit(Mobile.isConnectedOrConnecting);
    end;
  end;

  Result := False;
end;

function TNetStatusInfo.IsWifi: Boolean;
var
  Wifi: JNetworkInfo;
begin
  if Assigned(FConnectivityManager) then begin
    Wifi := FConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_WIFI);
    if Assigned(Wifi) then begin
      Exit(Wifi.isConnectedOrConnecting);
    end;
  end;

  Result := False;
end;

procedure TNetStatusInfo.OnNetworkChangedEvent(context: JContext; intent: JIntent);
var
  Wifi, Mobile: JNetworkInfo;
begin
  if Assigned(FConnectivityManager) then
  begin
    Wifi := FConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_WIFI);
    if Assigned(Wifi) and Wifi.isConnectedOrConnecting then begin
        FireNetworkChangedEvent(NET_WIFI);
        Exit;
    end else begin
      Mobile := FConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_MOBILE);
      if Assigned(Mobile) and Mobile.isConnectedOrConnecting then begin
          FireNetworkChangedEvent(NET_MOBILE);
          Exit;
      end;
    end;
  end;

  FireNetworkChangedEvent(NET_UNKNOWN);
end;

end.



猜你喜欢

转载自blog.csdn.net/weixin_42168423/article/details/80384232
今日推荐