NetworkInfo.isConnectedOrConnecting()在Service

时间:2017-09-29 14:24:54

标签: android android-service

NetworkInfo.isConnectedOrConnecting()调用Service时遇到false的奇怪行为。它只是返回public boolean isOnline() { if (mContext == null) { return false; } NetworkInfo netInfo = mConnectivityManager.getActiveNetworkInfo(); return netInfo != null && netInfo.isConnectedOrConnecting(); } ,尽管手机已连接到网络。从“活动”和“片段”中,此片段按预期工作。

emailable-report.html

有人遇到过这个问题吗?也许还有另一种检查服务中网络连接的方法。

2 个答案:

答案 0 :(得分:1)

在服务类中尝试这样的事情。

public boolean isOnline(Context context) {
    ConnectivityManager manager = (ConnectivityManager)
            context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (manager == null) {
        return false;
    }
    NetworkInfo networkInfo = manager.getActiveNetworkInfo();
    if (networkInfo != null){
        if (networkInfo.isConnectedOrConnecting()) {
            return true;
        }
    }
    return false;
}

修改:使用上下文单例:

    public class ServiceContextManager {
    private static ServiceContextManager instance;

    public static ServiceContextManager getInstance(Context context) {
        if (instance == null) {
            instance = new ServiceContextManager(context.getApplicationContext());
        }

        return instance;
    }

    private Context mContext;

    private ServiceContextManager(Context context) {
        mContext = context;
    }
}

答案 1 :(得分:1)

我使用的是确切的代码,直到昨天我发现更好的东西时才遇到同样的问题。它可能看起来不一样,但这确实很有效,因为它还检查是否有工作的互联网连接,因为isNetworkConnected()将返回true,如果连接的wifi没有互联网,所以你可以使用这个代码。

public boolean isOnline() throws InterruptedException, IOException
    {
        String command = "ping -c 1 google.com";
        return (Runtime.getRuntime().exec (command).waitFor() == 0);
    }

您也可以将google.com更改为任何网站,因为google.com可能会在某些国家/地区停用。
我在一项不是作为服务的活动中使用它,但它会起作用。