监听连接的广播接收器以随机间隔改变发射

时间:2016-06-07 09:35:07

标签: c# android xamarin

我有一个Xamarin.Android应用程序,它应该在运行它的设备连接到WiFi网络时同步我的数据。为了节省数据和电池,只有在检测到连接时才会发生这种情况。

唯一的问题是,应用程序会在一天中多次随机运行同步服务,尽管WiFi连接保持不变。现在,我只能想象Android系统多次发送广播以提醒应用程序连接状态或类似的东西。

我已经使用了一些快速修复,静态bool FirstTime那里,但我希望找到一个更优雅的解决方案。有什么建议吗?

这是我用来做的代码:

[BroadcastReceiver]
[IntentFilter(new string[] { "android.net.conn.CONNECTIVITY_CHANGE" })]
class ConnectivityReceiver : BroadcastReceiver
{
    public static bool FirstTime = true;
    public override void OnReceive(Context context, Intent intent)
    {
        if ( intent.Action != null && intent.Action == "android.net.conn.CONNECTIVITY_CHANGE") 
        {
            ConnectivityManager cm = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService);
            NetworkInfo info = cm.ActiveNetworkInfo;
            if (FirstTime && info != null)
            {
                FirstTime = false;
                Intent background = new Intent(context, typeof(BackgroundDataSyncService));
                context.StartService(background);
            }else
            {
                FirstTime = true;
                Intent background = new Intent(context, typeof(BackgroundDataSyncService));
                context.StopService(background);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:1)

你有一个名为Connectivity的插件可以从nuget中提取。 这个插件几乎与每个移动平台兼容,它只能在你想要的android中使用。 该插件为您完成所有代码,您只需订阅连接事件,如:

CrossConnectivity.Current.ConnectivityChanged += (sender, args) =>
{
    page.DisplayAlert("Connectivity Changed", "IsConnected: " + args.IsConnected.ToString(), "OK");
};

该插件还有其他不错的功能,请查看文档。

答案 1 :(得分:1)

检查Intent Bundle中的信息。我遇到过同样的问题。 每当系统从WiFi更改为Cellular或系统中发生任何其他奇怪的事情时,BroadCastReceiver都会发送一条消息。 起初我以为这是一个随机事件。 我还以为我必须使用ConnectivityManager来获取网络信息。 如果您阅读OnReceive附带的Intent Bundle(Context上下文,Intent intent),您将获得各种信息。

在我的测试中,我正在使用Visual Studio的模拟器。我使用内置工具从WiFi切换到Cell然后消除信号,以及改变信号强度。 我发现BroadcastReceiver报告至少两次;一次用于断开连接,一次用于重新连接。

以下是我阅读Bundle的方法。

Bundle extras = intent.Extras;

if (extras != null)
{
   foreach (String key in extras.KeySet())
   {
        Object value = extras.Get(key);
        Log.Info("myApp", "intent.extras " + key + " " + value.ToString());
   }
}

您还会发现Bundle的一部分也包含NetworkInfo。

object netObj = extras.Get("networkInfo");
NetworkInfo netInf = null;

if (netObj != null)
{
    netInf = (NetworkInfo)netObj;
}

这样,您可以检查不同网络功能的状态。

Log.Info("myApp", "netInf.IsAvailable: " + netInf.IsAvailable.ToString());
Log.Info("myApp", "netInf.IsConnected: " + netInf.IsConnected.ToString());

我真的希望这有助于某人 我已经追了好几天了。

答案 2 :(得分:0)

使用 Xamarin.Essentials.Connectivity.ConnectivityChanged 事件。订阅此活动。