在安卓设备上使用服务检测网络连接状态

7

我知道如何在应用程序打开时使用活动检查互联网连接状态。但是当我的应用程序没有运行时,如何在服务中检查连接性呢?


1
为什么要使用Socket,当系统提供了一种方法来查看网络是否连接呢? - panini
1
使用广播接收器,在清单文件中注册,并在接收器的 onReceive 方法中传递数据到你的服务,以便在网络状态改变时进行处理。 - Adnan
3个回答

13

您可能需要使用广播接收器。这样您就可以持续地接收连接状态的更新。(已连接/未连接)

示例:

清单文件:

权限:

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

注册广播接收器:

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

创建接收器类:

public class ConnectivityChangeReceiver extends BroadcastReceiver {


    @Override
    public void onReceive(Context context, Intent intent) {

        // Explicitly specify that which service class will handle the intent.
        ComponentName comp = new ComponentName(context.getPackageName(),
                YourService.class.getName());
        intent.putExtra("isNetworkConnected",isConnected(context));
        startService(context, (intent.setComponent(comp)));
    }

 public  boolean isConnected(Context context) {
           ConnectivityManager connectivityManager = ((ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE));
           NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
           return networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected();
   }

}

您的服务类:

class YourService extends IntentService{

    @Override
    protected void onHandleIntent(Intent intent) {
      Bundle extras = intent.getExtras();
      boolean isNetworkConnected = extras.getBoolean("isNetworkConnected");
      // your code

   }

}

setResultCode(Activity.RESULT_OK); 是不正确的。为什么?http://stackoverflow.com/questions/22360950/error-broadcastreceiver-trying-to-return-result - S.M_Emamian
你可以安全地删除这行。 - Adnan
如果应用程序没有运行且要启动的服务是后台服务,它会起作用吗? - Golu

3

当网络连接状态改变时,系统会提供一个Broadcast,您可以使用BroadcastReceiver来读取。无论您的应用程序是打开还是关闭,此操作都将被调用。


谢谢,那么,如果我想做某事(检查更新),我该怎么做? - S.M_Emamian
1
在BroadcastReceiver的onReceive方法中,您可以运行任意代码,因此如果您想在后台进行一些处理,可以启动一个Service或其他类似的东西来完成。 - panini

0
使用以下代码,您可以测试设备是否连接到互联网。 每当您尝试调用任何与互联网相关的Web服务或任务时,都可以随时使用此功能。 您可以在后台运行的Android服务中使用此功能。
public boolean isConnectingToInternet(Context _context){
        ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);
          if (connectivity != null)
          {
              NetworkInfo[] info = connectivity.getAllNetworkInfo();
              if (info != null)
                  for (int i = 0; i < info.length; i++)
                      if (info[i].getState() == NetworkInfo.State.CONNECTED)
                      {
                          return true;
                      }

          }
          return false;
    }

2
这并没有回答问题。楼主说他知道如何做,只是当应用程序没有打开时不知道怎么做。 - codeMagic
1
我知道当我的应用程序打开时如何在活动中检查互联网是否可用。 - S.M_Emamian
我更新了答案。你可以在Android服务中使用这个函数,你需要创建服务并启动它。你可能需要处理广播接收器来处理设备重启后的自动启动等问题。 - Sanket Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接