简体   繁体   English

如何用CONNECTIVITY_CHANGE定义Broadcastreceiver?

[英]how define Broadcastreceiver with CONNECTIVITY_CHANGE?

I am android beginner and want to declare a broadcastreceiver which reacts on CONNECTIVITY_CHANGE. 我是android初学者,想声明对CONNECTIVITY_CHANGE有反应的broadcastreceiver。 I have tried the following: 我尝试了以下方法:

private void checkInternet () {
    IntentFilter ifilter = new IntentFilter ("android.net.conn.CONNECTIVITY_CHANGE");
    broadcastreceiver = new BroadcastReceiver () {
        @Override
        public void onReceive (Context Context, Intent Intent) {
            ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService (getApplicationContext (). CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo ();
            if (networkInfo! = null && networkInfo.getState () == NetworkInfo.State.CONNECTED)
                Toast.makeText (getApplicationContext (), "Internet", Toast.LENGTH_SHORT) .show ();
            else
                Toast.makeText (getApplicationContext (), "No Internet", Toast.LENGTH_SHORT) .show ();
        }
    };
    this.registerReceiver (broadcastreceiver, ifilter);
}

In Actitvity.onCreate I call checkInternet. 在Actitvity.onCreate中,我称为checkInternet。 When I disconnect the Internet both messages "No Internet" and "Internet" are displayed. 当我断开Internet连接时,会同时显示“ No Internet”和“ Internet”消息。 And when I connect the Internet both messages "No Internet" and "Internet" come again and in the same order. 当我连接Internet时,“ No Internet”和“ Internet”这两个消息又以相同的顺序出现。 Can someone please tell me why the Broadcastreceiver 2 times starts and shows 2 different status pro Start? 有人可以告诉我为什么两次启动Broadcastreceiver并显示2个不同的状态Pro吗? I thank you in advance 我提前谢谢你

if you just need to check for internet connectivity, you can use the following. 如果您只需要检查Internet连接,则可以使用以下内容。 In your activity 在您的活动中

 @Override
 protected void onCreate(Bundle savedInstanceState){
       ConnectionStateMonitor connectionStateMonitor = new ConnectionStateMonitor();
    connectionStateMonitor.enable(this);
 }

and add this class inside your activity 并在活动中添加此类

public class ConnectionStateMonitor extends ConnectivityManager.NetworkCallback {

    final NetworkRequest networkRequest;

    public ConnectionStateMonitor() {
        networkRequest = new NetworkRequest.Builder().
                addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR).addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build();
    }

    public void enable(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        connectivityManager.registerNetworkCallback(networkRequest , this);
    }
    // Likewise, you can have a disable method that simply calls ConnectivityManager#unregisterCallback(networkRequest) too.

    @Override
    public void onAvailable(Network network) {
         //do what you want when Connection is available
    }
    @Override
    public void onLost(Network network){
        //Connection Lost
    }
}

I think this will be easier than using a broadCast receiver 我认为这比使用broadCast接收器容易

Try the following example: 请尝试以下示例:

Implementation: 执行:

public class NetworkReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
            NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
            if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.CONNECTED) {
                Log.d("Network status: ", "Connected");
            } else if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.DISCONNECTED) {
                Log.d("Network status: ", "Not connected");
            }
        }
    }
}

Add receiver in your AndroidMenifest: 在您的AndroidMenifest中添加接收器:

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

Create a new class which will extend from BroadcastReceiver. 创建一个新类,该类将从BroadcastReceiver扩展。 Here you define the intent filter for connectivity change. 在这里,您可以定义用于连接更改的意图过滤器。 Also we create a new private method to retrieve the current status of the network connection. 此外,我们还创建了一个新的私有方法来检索网络连接的当前状态。

public class ConnectivityChangedBroadcastReceiver extends BroadcastReceiver {

public static IntentFilter getIntentFilter() {
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
    return intentFilter;
}

@Override
public void onReceive(Context context, Intent intent) {
    if (isNetworkAvailable(context)) {
        // Network is available
    } else {
        // Network is not available
    }
}

private boolean isNetworkAvailable(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting();
}}

Now register your broadcast receiver in the activity or application class like this. 现在,像这样在活动或应用程序类中注册您的广播接收器。 Please note that Apps targeting Android 7.0 (API level 24) and higher do not receive CONNECTIVITY_ACTION broadcasts if they declare the broadcast receiver in their manifest. 请注意,定位到Android 7.0(API级别24)及更高版本的应用如果在清单中声明了广播接收器,则不会接收CONNECTIVITY_ACTION广播。 Apps will still receive CONNECTIVITY_ACTION broadcasts if they register their BroadcastReceiver with Context.registerReceiver() and that context is still valid. 如果应用向C​​ontext.registerReceiver()注册其BroadcastReceiver,并且该上下文仍然有效,则它们仍将接收CONNECTIVITY_ACTION广播。 So, if you want to target latest versions of Android then make sure you register the receiver in the code and not manifest 因此,如果要定位最新版本的Android,请确保您在代码中注册了接收者,而不是清单

ConnectivityChangedBroadcastReceiver connectivityChangedBroadcastReceiver;
connectivityChangedBroadcastReceiver = new ConnectivityChangedBroadcastReceiver();
registerReceiver(connectivityChangedBroadcastReceiver, ConnectivityChangedBroadcastReceiver.getIntentFilter());

as said all solutions work and the problem is the VM. 如前所述,所有解决方案都有效,问题出在虚拟机上。 When I disconnect the Internet on my computer, the VM still has the physical connection but only the communication is not possible. 当我断开计算机上的Internet连接时,VM仍然具有物理连接,但无法进行通信。 Therefore the messages "Not connected" "connected" are shown in this order when disconnecting or connecting on my PC 因此,在我的PC上断开连接或连接时,消息“未连接”,“已连接”按此顺序显示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM