有一次,我有一个问题,你们真的很有帮助。所以在这里,我又遇到了另一个问题......:/
我正在运行一个扩展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>
...
我还应该注意到我也试过了
我的清单文件中的<action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" />
没有任何更改,当我更改了该行时:
intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)
至
intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, true)
结果总是如此 - 因此它总是试图停止我的服务而永远不会启动它。
我怀疑根本没有读取Intent的Extras,这就是getBooleanExtra()
的默认值总是返回的原因。
PS。我在Android 2.1上
谢谢!
答案 0 :(得分:3)
我不确定BroadcastReceiver
内无法阅读的额外内容,但我可以通过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)。
答案 1 :(得分:2)
不知道奇怪的NO_CONNECTIVITY标志,但您可以从意图中检索活动网络:
(NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
你可以在这个对象上调用isConnected()。