从BroadCast发送意图时为Null Extra

时间:2017-09-14 13:02:39

标签: android android-intent broadcastreceiver

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

这是BroadcastReceiver

          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"));
    }
}

}

这是我的活动代码:

           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>

意图适用于LauncherActivity。

修改

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

2 个答案:

答案 0 :(得分:2)

  

但我得到一个null Extra

Android "internet"上没有"cnx"Intent额外费用。而且,你正在创造一个无限循环。

  1. 系统发出CONNECTIVITY_ACTION广播。

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

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

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

  5. 一位接收者将"cnx"额外费用重新添加到CONNECTIVITY_ACTION Intent并发送广播。

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

  7. 一位接收者将"cnx"额外费用重新添加到CONNECTIVITY_ACTION Intent并发送广播。

  8. 泡沫,冲洗,重复

  9. 首先,使用系统广播在应用的单个进程中进行通信。使用LocalBroadcastManager

    其次,发送带有系统Intent操作的广播。充其量,你搞砸了设备上的许多其他应用程序。最糟糕的是,你崩溃了,因为系统阻止你发送那个广播。

    而且,as Burhanuddin pointed out,您没有使用相同的密钥。

答案 1 :(得分:1)

您的意图密钥不同 你关键的是&#34; cnx&#34;

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

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

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

您正在使用&#34; internet&#34;关键在这里

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

将其更改为:

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