Search code examples
c#xamarincallbackandroid-pendingintent

How to use PendingIntent instead of an Intent with ConnectivityManager.ConnectivityAction with a callback in C# Xamarin API 28?


I need to make a simple callback in Xamarin, to check if the network status is connected or disconnected.

I have so far been doing it with this code:

class NetworkControl : INetworkControl
{
    private readonly INetworkControl.ICallback _callback;
    private readonly Context _context;
    private readonly NetworkBroadcastReceiver _receiver = new NetworkBroadcastReceiver();

    public NetworkControl(INetworkControl.ICallback callback, Context context)
    {
        _callback = callback;
        _context = context;
        IntentFilter filter = new IntentFilter(ConnectivityManager.ConnectivityAction);
        context.RegisterReceiver(_receiver, filter);
    }

    public INetworkControl.ICallback Callback => _callback;

    public INetworkControl.NetworkStatus Status
    {
        get
        {
            var current = Connectivity.NetworkAccess;
            if (current == NetworkAccess.Internet)
            {
                return INetworkControl.NetworkStatus.Connected;
            }
            return INetworkControl.NetworkStatus.Disconnected;
        }
    }
}


class NetworkBroadcastReceiver : BroadcastReceiver
{

    private static String TAG = "NetworkBroadcastReceiver";

    public override void OnReceive(Context context, Intent intent)
    {


       if (ShellBridge.Instance != null)
       {
           if (intent.Action.Equals(ConnectivityManager.ConnectivityAction))
           {
               NetworkInfo ni = (NetworkInfo)intent.Extras.Get(ConnectivityManager.ExtraNetworkInfo);
               if (ni.isConnected) 
               {
                   // do something if connected
                   ShellBridge.Instance.NetworkBridge.Callback.NetworkStatusChanged(INetworkControl.NetworkStatus.Connected);
               } else 
               {
                   ShellBridge.Instance.NetworkBridge.Callback.NetworkStatusChanged(INetworkControl.NetworkStatus.Connected);
               }

           }

       }

    }

The problem is, the function ConnectivityManager.ConnectivityAction in the Intent creating is depricated, and will soon be obsolete. After searching, I found that the pendingIntent should be used for that, but I could not find any valid example of how to use it.

The closest to what I need is this:

https://stackoverflow.com/questions/58588132/how-to-use-registernetworkcallback-with-pendingintent

But, it has not all the information I need. I need it to be all programmatically, without changing the manifest, for, my app should be a fore- and background app.

Please help, and thank you for your time.


Solution

  • You can take a look at NetworkCallback .

    public class ConnectionStateMonitor : NetworkCallback  
        {
            NetworkRequest networkRequest;
    
            public ConnectionStateMonitor()
            {
                networkRequest = new NetworkRequest.Builder().
                    AddTransportType(TransportType.Cellular).
                    AddTransportType(TransportType.Wifi).Build();
            }
    
            public void enable(Context context) {
                ConnectivityManager connectivityManager = context.GetSystemService(Context.ConnectivityService) as ConnectivityManager;
                connectivityManager.RegisterNetworkCallback(networkRequest, this);
            }
    
            public override void OnAvailable(Network network)
            {
                //network available
            }
    
            public override void OnLost(Network network)
            {
                //network lost
            }
        }
    

    Usage

    You just need to instantiate the class ConnectionStateMonitor and enable it , you could detect the network status with the method OnAvailable and OnLost .

    ConnectionStateMonitor m = new ConnectionStateMonitor ();
    m.enable(context);
    

    Refer

    https://github.com/xamarin/Essentials/issues/512

    ConnectivityManager.CONNECTIVITY_ACTION deprecated