【问题标题】:getBoolean(EXTRA_NO_CONNECTIVITY) always returns falsegetBoolean(EXTRA_NO_CONNECTIVITY) 总是返回 false
【发布时间】:2011-11-06 22:16:29
【问题描述】:

有一次我遇到问题,你们真的很有帮助。所以我又遇到了另一个问题……:/

我正在运行一个扩展 BroadcastReceiver 的自定义 NetworkReceiver。我想检测手机何时有互联网连接,以便我可以随时启动服务。我已经阅读了很多主题,所有主题或多或少都会提示以下对我不起作用的代码:

public class NetworkReceiver extends BroadcastReceiver {

private static final String tag = NetworkReceiver.class.getSimpleName();

@Override
public void onReceive(Context context, Intent intent) {
    Log.i(tag,"****** NetworkReceiver // onReceive()");

    boolean noConnection = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);

    if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
        Log.i(tag,"****** NetworkReceiver // Network Down?: " + intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false));
    }

    // TODO Bug: Never stops the service. Stays always connected!
    if(noConnection) {
        Log.i(tag,"****** NetworkReceiver // Stopping Service...");
        context.stopService(new Intent(context, FetchService.class));
    } else {
        Log.i(tag,"****** NetworkReceiver // Starting Service!");
        context.startService(new Intent(context, FetchService.class));
    }
}

我遇到的问题是 logcat 总是返回 NetworkDown?: false 并且服务永远不会停止(它一直在重新启动)。我在模拟器上按 F8 进行了尝试,我也在我的开发手机上尝试了它(它没有 SIM,通过我的 wifi 路由器访问互联网)关闭路由器 -> 没有互联网访问保证!

我的清单包括以下几行:

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

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

我还应该注意,我也尝试过 &lt;action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" /&gt; 在我的清单文件中没有任何更改,当我更改该行时: intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, true) 结果总是正确的 - 因此它总是试图停止我的服务并且从不启动它。

我怀疑 Intent 中的 Extras 根本没有被读取,这就是为什么 getBooleanExtra() 的默认值总是返回的原因。

附言。我使用的是 Android 2.1

谢谢!

【问题讨论】:

    标签: android broadcastreceiver android-intent intentfilter connectivity


    【解决方案1】:

    我不确定 BroadcastReceiver 中无法读取的 Extras,但我可以向您展示我使用 BroadcastReceiver 的方式与您类似的目的。

    我的接收器只捕获连接变化,但它不评估连接状态。它会通知Service,因为在这两种情况下(连接或未连接),该服务都会有所作为。这个服务在那个时候可以运行也可以不运行,所以它要么被启动要么被“通知”(记住you can safely call startService() several times,这些调用不会嵌套):

    public class ConnectivityReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            final Intent intentService = new Intent(context, MyService.class);
            intentService.putExtra(MyService.INTENT_HANDLE_CONNECTIVITY_CHANGE, "");
    
            context.startService(intentService);
        }
    }
    

    然后,在我的服务中,我会评估连接性,然后采取相应的行动。请注意,我不会以与您相同的方式评估连接状态,这可能是下面的代码有效但您的代码无效的原因(以下仅是相关代码):

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent != null) {
            final Bundle bundle = intent.getExtras();
    
            // Handle the intent INTENT_HANDLE_CONNECTIVITY_CHANGEif any
            if ((bundle != null) && (bundle.get(INTENT_HANDLE_CONNECTIVITY_CHANGE) != null)) {         
                handleConnectivity(); 
            }
        }
    
        return START_STICKY;
    }
    
    private void handleConnectivity() {
        final ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        final NetworkInfo netInfo = cm.getActiveNetworkInfo();
    
        if(netInfo != null && netInfo.isConnected()) {
            // WE ARE CONNECTED: DO SOMETHING
        }   
        else {
            // WE ARE NOT: DO SOMETHING ELSE    
        }
    }
    

    这在 Android-7 (2.1) 下也可以正常工作。

    【讨论】:

    • 我知道您使用的方法。但是我有点惊讶很多人推荐了我使用的代码(我也在我最近在 android 上购买的 O'reilly 书上读过它!)如果我找不到 CONNECTIVITY_ACTION 广播的解决方案,我想我将按照您的示例使用 ConnectivityManager 的方法检查我的服务。感谢您的回复:)
    • 不客气@snoopaki - 实际上我更愿意使用您的方法提供解决方案,但我只是不知道发生了什么以及为什么。
    • 我实际上将我的服务更改为 IntentService,并且对连接更改的服务中处理更有意义。所以我应该适当地选择你的答案作为正确的答案!谢谢 :)
    【解决方案2】:

    不知道奇怪的 NO_CONNECTIVITY 标志,但您可以从意图中检索活动网络:

    (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
    

    你可能只需要在这个对象上调用 isConnected()。

    【讨论】:

    • 感谢您的回复,我会记住的。对于当前的任务,我使用了上面的答案,它在 atm 上运行得很好:)
    • 这个常量现在被弃用了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2021-11-05
    • 2018-11-05
    • 2019-05-06
    • 2017-04-29
    • 2013-04-30
    • 2015-01-20
    相关资源
    最近更新 更多