如何在 C# Xamarin API 28 中使用 PendingIntent 而不是 Intent 与 ConnectivityManager.ConnectivityAction 进行回调?

问题描述 投票:1回答:1

我需要在 Xamarin 中做一个简单的回调,以检查网络状态是连接还是断开。

到目前为止,我一直在使用这段代码。

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);
               }

           }

       }

    }

问题是,在Intent创建中的函数ConnectivityManager.ConnectivityAction已经失效了,而且很快就会被淘汰。经过搜索,我发现应该用pendingIntent来实现,但我找不到任何有效的例子来说明如何使用它。

最接近我所需要的是这个。

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

但它并没有提供我所需要的所有信息 我需要在不改变manifest的情况下,通过编程来实现 因为,我的应用程序应该是一个前台和后台的应用程序

请帮助,并感谢您的时间。

c# xamarin callback android-pendingintent
1个回答
1
投票

你可以看一下 网络回调 .

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
        }
    }

用法

你只需要实例化ConnectionStateMonitor类,并启用它,你可以用方法检测网络状态。OnAvailableOnLost .

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

参考

https:/github.comxamarinEssentialsissues512。

ConnectivityManager.CONNECTIVITY_ACTION 已废弃。


1
投票

你不需要重新发明轮子。你可以通过Xamarin Essentials实现这一切。连接性.

除了检查是否有这样的连接。

var current = Connectivity.NetworkAccess;
if (current == NetworkAccess.Internet)
{
    // Connection to internet is available
}

你还可以跟踪连接类型的变化。

public class ConnectivityTest
{
    public ConnectivityTest()
    {
        // Register for connectivity changes, be sure to unsubscribe when finished
        Connectivity.ConnectivityChanged += Connectivity_ConnectivityChanged;
    }

    void Connectivity_ConnectivityChanged(object sender, ConnectivityChangedEventArgs e)
    {
        var access = e.NetworkAccess;
        var profiles = e.ConnectionProfiles;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.