【问题标题】:Checking internet connection in background when app closed应用程序关闭时在后台检查互联网连接
【发布时间】:2019-12-11 07:53:11
【问题描述】:

我想在我的应用关闭时检查互联网连接变化,例如 Wifi、数据、以太网。

到目前为止,我编写的代码不起作用

主活动

public class MainActivity : AppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.activity_main);
    }

    protected override void OnResume()
    {
        base.OnResume();
        var networkReceiver = new NetworkStateReceiver();
        IntentFilter intentFilter = new IntentFilter(ConnectivityManager.ConnectivityAction);
        RegisterReceiver(networkReceiver, intentFilter);
    }

    protected override void OnPause()
    {
        try
        {
            base.OnPause();
            var networkReceiver = new NetworkStateReceiver();
            UnregisterReceiver(networkReceiver);
        }
        catch (System.Exception)
        {
        }
    }
}

NetworkStateReceiver.cs

public class NetworkStateReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        ComponentName comp = new ComponentName(context.PackageName, Java.Lang.Class.FromType(typeof(YourService)).Name);
        intent.PutExtra("isNetworkConnected", isConnected(context));
        context.StartService((intent.SetComponent(comp)));

    }

    public bool isConnected(Context context)
    {
        ConnectivityManager connectivityManager = ((ConnectivityManager)context.GetSystemService(Context.ConnectivityService));
        NetworkInfo networkInfo = connectivityManager.ActiveNetworkInfo;
        return networkInfo != null && networkInfo.IsAvailable && networkInfo.IsConnected;
    }
}

服务类

public class YourService : IntentService
{
    protected override void OnHandleIntent(Intent intent)
    {
        Bundle extras = intent.Extras;
        var isNetworkConnected = extras.GetBoolean("isNetworkConnected");
        if (isNetworkConnected)
        {
            StartChrome("https://www.google.com/");
        }
        else
        {
            StartChrome("https://www.microsoft.com/");
        }
    }

    public void StartChrome(string url)
    {
        try
        {
            Intent i = new Intent("android.intent.action.MAIN");
            i.SetComponent(ComponentName.UnflattenFromString("com.android.chrome/com.android.chrome.Main"));
            i.AddCategory("android.intent.category.LAUNCHER");
            i.SetData(Uri.Parse(url));
            Application.Context.StartActivity(i);
        }
        catch (ActivityNotFoundException e)
        {
            // Chrome is probably not installed
        }
    }
}

清单

 <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="27" />

  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
  <uses-permission android:name="android.permission.INTERNET" />

  <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme">
  </application>

  <receiver android:name=".NetworkStateReceiver">
    <intent-filter>
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
  </receiver>

  <service
           android:name=".YourService"
           android:exported="true"
           android:permission="android.permission.BIND_JOB_SERVICE"/>

【问题讨论】:

  • ,您的问题现在解决了吗,如果您有解决方案,请在这里分享您的解决方案。
  • @CherryBu-MSFT - 我会发帖的..

标签: android xamarin xamarin.android


【解决方案1】:

我正在使用这个

    fun isOnline(context:Context): Boolean {
        return try {
            val connectivityManager = context.getSystemService(
                    Context.CONNECTIVITY_SERVICE) as ConnectivityManager
            connectivityManager.activeNetworkInfo != null &&
                    connectivityManager.activeNetworkInfo.isConnected
        } catch (exception: Exception) {
            false
        }
    }

或用于监听连接更新:

注册接收者:

val receiver = object : BroadcastReceiver() {
            override fun onReceive(context: Context, intent: Intent) {
                handelConnectionCallback()
            }
 val intentFilter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
        context.registerReceiver(receiver, intentFilter)

【讨论】:

  • 在哪里写这个?
  • 查看更新的答案,它是连接检查的功能
  • 是的,它应该在后台或前台服务中工作,只要它们没有被杀死
  • 让我检查一下。这是 java 还是 kotlin?
  • 它是 Kotlin :)
猜你喜欢
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多