检查INTENT互联网连接

Cec*_*oCQ 69 android broadcastreceiver android-intent

Intent ACTION_XXX当有Internet连接时,是否有Android 通知我?

我想实例化BroadcastReceiver当用户启用Internet连接时通知我的应用程序(通过wifi,通过GSM等)

谁能帮助我?

fed*_*edj 161

<receiver android:name=".YOURRECEIVER">
   <intent-filter>
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
   </intent-filter>
</receiver>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Run Code Online (Sandbox Code Playgroud)

  • 此代码不适用于Android 7+设备,因为[this](https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html#MonitorChanges) (26认同)
  • @ShreyashSSarnayak这是对的.我想补充一点,从android N开始,你需要在活动中注册(和注销)你的广播接收器.将此保留在XML Manifest中不会影响您的活动在Android N上接收连接更改的能力.只是对那些想知道的人的澄清. (5认同)

luj*_*jop 126

接受的答案是正确的.我只添加了Receiver代码来完成:

public class NetworkStateReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
     Log.d("app","Network connectivity change");
     if(intent.getExtras()!=null) {
        NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
        if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) {
            Log.i("app","Network "+ni.getTypeName()+" connected");
        } else if(intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) {
            Log.d("app","There's no network connectivity");
        }
   }
}
Run Code Online (Sandbox Code Playgroud)

  • ``BroadcastReceiver.onReceive``是抽象的,所以你不能调用``super.onReceive(context,intent);``. (26认同)
  • 您在哪里(文档)找出getExtras()Bundle的内容? (3认同)
  • 不适用于Android 7.0及更高版本. (2认同)

Fel*_*ima 56

更新@lujop回答:

public class NetworkStateReceiver extends BroadcastReceiver {
    private static final String TAG = "NetworkStateReceiver";

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

        Log.d(TAG, "Network connectivity change");

        if (intent.getExtras() != null) {
            final ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
            final NetworkInfo ni = connectivityManager.getActiveNetworkInfo();

            if (ni != null && ni.isConnectedOrConnecting()) {
                Log.i(TAG, "Network " + ni.getTypeName() + " connected");
            } else if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) {
                Log.d(TAG, "There's no network connectivity");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答.您已经解决了已弃用的`EXTRA_NETWORK_INFO`的问题.+1 (5认同)
  • 虽然这看起来效果更好,但我从未看到"无网络连接"消息,尽管关闭了wifi和移动数据 (2认同)

vuh*_*990 18

MyReceiver.java

public class MyReceiver extends BroadcastReceiver{

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

        if(isConnected(context)) Toast.makeText(context, "Connected.", Toast.LENGTH_LONG).show();
        else Toast.makeText(context, "Lost connect.", Toast.LENGTH_LONG).show();
    }

    public boolean isConnected(Context context) {
        ConnectivityManager cm =
                (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null &&
                              activeNetwork.isConnected();
        return isConnected;
    }
}
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml中

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Run Code Online (Sandbox Code Playgroud)

UPDATE

如果您的应用程序的目标是API级别26或更高级别,则您无法使用清单来声明隐式广播的接收方(特定地不针对您的应用的广播),除了一些免于该限制的隐式广播.在大多数情况下,您可以使用预定作业.

用法 connection = MyReceiver()

// onCreate - onDestroy, onResume - onPause depends on you
override fun onStart() {
    super.onStart()
    registerReceiver(connection, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION))
  }

override fun onStop() {
    super.onStop()
    // remember unregister to avoid leak
    unregisterReceiver(connection)
  }
Run Code Online (Sandbox Code Playgroud)

更新2

CONNECTIVITY_ACTION这个常量是在API层面弃用28.应用程序应该使用更灵活requestNetwork(NetworkRequest, PendingIntent),registerNetworkCallback(NetworkRequest, PendingIntent)registerDefaultNetworkCallback(ConnectivityManager.NetworkCallback)功能,而不是关于他们所关心的网络变化更快,更详细的更新.

因为它added in API level 22,所以上面的代码将在所有版本的android上正常工作


has*_*san 16

所有答案中缺少的部分是提醒您注册该操作:

IntentFilter filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(your_receiver, filter);
Run Code Online (Sandbox Code Playgroud)

  • 接受的答案确实注册了听众.它只是在清单中的XML中,而不是像你建议的代码. (4认同)

Nic*_*cky 8

此代码将起作用(在所有版本中),因为清单注册不适用于7+(API 25及更高版本)设备,请参阅此链接.

private void foo(){
    registerReceiver(connectionBroadcastReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}

private BroadcastReceiver connectionBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent == null || intent.getExtras() == null)
           return;

        ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = cm.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.getState() == NetworkInfo.State.CONNECTED) {  
            // connected
        } 
    }
};
Run Code Online (Sandbox Code Playgroud)


W4R*_*0CK 7

我每次都使用广播来检查连接.创建连接信息的类.

import android.content.Context;
import android.content.ContextWrapper;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;


public class ConnectivityStatus extends ContextWrapper{

    public ConnectivityStatus(Context base) {
        super(base);
    }

    public static boolean isConnected(Context context){

        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo connection = manager.getActiveNetworkInfo();
        if (connection != null && connection.isConnectedOrConnecting()){
            return true;
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

将代码应用到您的活动中:

 private BroadcastReceiver receiver = new BroadcastReceiver() {
 @Override
 public void onReceive(Context context, Intent intent) {
        if(!ConnectivityStatus.isConnected(getContext())){
            // no connection
        }else {
            // connected
        }
    }
 };
Run Code Online (Sandbox Code Playgroud)

在您的活动onCreate()方法中注册广播:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);
    your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
    ..
    ...
    ....
  }
Run Code Online (Sandbox Code Playgroud)

不要忘记在活动周期中取消注册/注册:

@Override
protected void onResume() {
    super.onResume();
    your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

}

@Override
protected void onPause() {
    super.onPause();
    your_activity_context.unregisterReceiver(receiver);

}
Run Code Online (Sandbox Code Playgroud)


JRE*_*exe 6

继续喵喵m答案

您可以通过以下方式启用/禁用接收器:

启用

 ComponentName receiver = new ComponentName(MainActivity.this, MyReceiver.class);
       PackageManager pm = this.getPackageManager();
       pm.setComponentEnabledSetting(receiver,
               PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
               PackageManager.DONT_KILL_APP);
       Toast.makeText(this, "Disabled broadcst receiver", Toast.LENGTH_SHORT).show();
   }
Run Code Online (Sandbox Code Playgroud)

禁用

ComponentName receiver = new ComponentName(MainActivity.this, MyReceiver.class);
       PackageManager pm = this.getPackageManager();
       pm.setComponentEnabledSetting(receiver,
               PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
               PackageManager.DONT_KILL_APP);
       Toast.makeText(this, "Enabled broadcast receiver", Toast.LENGTH_SHORT).show();
   }
Run Code Online (Sandbox Code Playgroud)

其中,可以在Intent或onCreate中调用它

  • 错别字:我认为你的意思是"禁用""启用",反之亦然. (2认同)