从 BroadCast 发送意图时为 Null Extra

Null Extra when sending intent from BroadCast

我有一个广播接收器,它检测应用程序是否连接到 Internet 并发送带有额外字符串的意图。但是我得到了一个空的 Extra :

这是广播接收器

          public class NetworkChangeReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    final ConnectivityManager connMgr = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);

    final android.net.NetworkInfo wifi = connMgr
            .getNetworkInfo(ConnectivityManager.TYPE_WIFI);

    final android.net.NetworkInfo mobile = connMgr
            .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

    if (wifi.isAvailable() || mobile.isAvailable()) {

        context.sendBroadcast(new Intent().putExtra("cnx","yes"));
    }
    else{

        context.sendBroadcast(new Intent().putExtra("cnx","no"));
    }
}

}

这是我的 Activity 代码:

           networkChangeReceiver=new NetworkChangeReceiver() {
        @Override
    public void onReceive(Context context, Intent intent) {
            String val=intent.getStringExtra("cnx");
            Snackbar snackbar = Snackbar
                    .make(layoutLauncher, "Pas de connexion Internet!"+val, Snackbar.LENGTH_LONG);
            snackbar.show();
          /*  if (val.equals("internet")){
        isNetworkAvailable(false);
            }
            else{
                isNetworkAvailable(true);
            }*/
    }
};

这是注册码

             private void registerNetworkBroadcast() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        registerReceiver(networkChangeReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        registerReceiver(networkChangeReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
    }
}

这是清单的一部分

          <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="tn.formation.mdsoft.bulletinimmobilier">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
      <application.....

       <activity android:name=".ui.activities.LauncherActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service
        android:name=".services.MyFirebaseMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>
    <service
        android:name=".services.MyFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>
    <receiver android:name=".tools.NetworkChangeReceiver" >
    </receiver>

Intent 适用于 LauncherActivity。

编辑

这个场景无论如何都是错误的,所以我忽略了它的实现,但在这种情况下,最好验证密钥。

But I am getting a null Extra

Android 在 Intent 上没有 "internet""cnx"。而且,你正在创建一个无限循环。

  1. 系统发出CONNECTIVITY_ACTION广播

  2. 您有两个注册了该广播的接收器,并且都接收了该广播,没有 "internet""cnx" 额外的。

  3. 一个接收者将 "cnx" 额外添加到 CONNECTIVITY_ACTION Intent 并发送广播。

  4. 您有两个注册了该广播的接收器,并且都接收了广播,并且 "cnx" 额外。

  5. 一个接收者将 "cnx" extra 重新添加到 CONNECTIVITY_ACTION Intent 并发送广播。

  6. 您有两个注册了该广播的接收器,并且都接收了广播,并且 "cnx" 额外。

  7. 一个接收者将 "cnx" extra 重新添加到 CONNECTIVITY_ACTION Intent 并发送广播。

  8. 起泡、冲洗、重复

首先,不要使用系统广播在应用程序的单个进程内进行通信。使用 LocalBroadcastManager.

其次,不要发送带有系统Intent操作的广播。充其量,你搞砸了设备上的许多其他应用程序。在最坏的情况下,您会崩溃,因为系统会阻止您发送该广播。

而且,,您没有为您的额外使用相同的密钥。

您的意图键不同 在这里你的关键是 "cnx"

if (wifi.isAvailable() || mobile.isAvailable()) {

        context.sendBroadcast(intent.putExtra("cnx","yes"));
    }
    else{

        context.sendBroadcast(intent.putExtra("cnx","no"));
    }

您正在使用此处的 "internet" 键检索

 String val=intent.getStringExtra("internet");

改为:

String val=intent.getStringExtra("cnx");