【问题标题】:Internet Connectivity Change Broadcast Not Happening互联网连接更改广播未发生
【发布时间】:2016-02-11 04:07:03
【问题描述】:

由于某种原因,我的网络更改接收器无法正常工作,并向我的 Android 应用程序中的 NetworkStateReceiver 类广播 CONNECTIVITY_CHANGE。我检查了它是否只是我的对话框的问题,但应该打印出来的 Log.d 不是。

这是 AndroidManifest.xml 的代码:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<receiver android:name="com.main.main.NetworkStateReceiver">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
    </receiver>

这是 NetworkStateReceiver.java 的代码:

package com.main.main;

import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;

public class NetworkStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
    final AlertDialog dialog = new AlertDialog.Builder(context)
            .setTitle("Connection Failed")
            .setMessage("Please Check Your Internet Connection")
            .setPositiveButton("Try Again", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    //Code for try again
                }
            })
            .setNegativeButton("Exit", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {

                }
            }).create();
    if (intent.getExtras() != null) {
        final ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        final NetworkInfo ni = connectivityManager.getActiveNetworkInfo();
        if (ni != null && ni.isConnectedOrConnecting()) {
            Log.d("INTERNET_MESSAGE", "Connected to internet");
            dialog.dismiss();
        } else if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) {
            Log.d("INTERNET_MESSAGE", "Disconnected from internet");
        }
    }
}

}

【问题讨论】:

  • dialog.show() 在哪里; ??日志没有显示,因为这两个条件都不成立,在最后加上 else 并再次检查。
  • @DhawalSodhaParmar 好的,我在最后添加了一个 else 以及一个日志,并且日志正在打印。您能否粘贴修改后的 if 和 else if 块,用于确定是否存在互联网连接?
  • 检查我的答案之一stackoverflow.com/a/15546897/1168654

标签: java android broadcastreceiver android-internet network-state


【解决方案1】:

最好按如下方式检查 Internet 连接:

只需将一个通用实用程序类中的一个通用函数设为

  /*
* A Common function to check internet connection.
* */
public static boolean isOnline(Context c) {
    try {
        ConnectivityManager cm = (ConnectivityManager) c.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnectedOrConnecting()) {
            return true;
        }
        return false;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

现在,在您的代码中需要互联网连接的地方使用它,如下所示:

       if (isOnline(YourActivity.this)) {
            //Your Tasks..
        } else {
          //Display your AlertBox..
        }

【讨论】:

    【解决方案2】:

    您需要在清单中启用您的接收器..它会工作..

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

    【讨论】:

    • 很好……但是android:enabled默认为真,只是让android系统实例化接收器。我认为您的意思是android:exported,它允许接收者获取来自应用程序外部的事件(这是 OP 需要的)。添加到我的答案中。
    • 您是否在活动生命周期中注册和取消注册您的监听器??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2012-09-20
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    相关资源
    最近更新 更多