【问题标题】:Null Extra when sending intent from BroadCast从广播发送意图时为 Null Extra
【发布时间】:2017-09-14 13:02:38
【问题描述】:

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

这是广播接收器

          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>

intent 用于 LauncherActivity。

编辑

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

【问题讨论】:

  • 你能分享你的Androidmanifest.xml文件吗
  • 因此您使用密钥cnx 传递数据并使用internet 获取数据。当然它会是空的。
  • 经过几次更正后我搞砸了,即使使用正确的密钥它仍然为空
  • 您的代码将无法在 Nougat 及更高版本上按预期工作,因为根据 API 文档,Manifest 声明的连接事件的 BroadcastReceivers 不会被触发。然后你重写在代码中手动注册的 NetworkChangeReceiver 的 onReceive 方法,所以你总是会得到一个 null 额外的,因为你实际上是连接接收器不会转发包含“是”或“否”的意图。

标签: android android-intent broadcastreceiver


【解决方案1】:

但是我得到了一个 null Extra

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

  1. 系统发出CONNECTIVITY_ACTION广播。

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

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

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

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

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

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

  8. 起泡、冲洗、重复

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

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

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

【讨论】:

  • 你能解释一下吗:First, do not use system broadcasts for communicating within a single process of an app. Use LocalBroadcastManager.。为什么我们不应该使用它:)。
  • 我更正了密钥,但没有,怎么是两个接收器?现在正在从一项活动中接收它并需要从所有当前活动中接收它,它仍然算作系统广播吗?
  • @MeknessiHamida 您希望在 BroadcastReceiver 中接收的事件是系统调度的事件,这意味着不是您的应用程序广播它,而是 Android 操作系统广播它。您有两个接收器,因为您在清单中声明了一个,在您的活动中声明了一个。
  • @M.WaqasPervez:“为什么我们不应该使用它”——安全性,加上 IPC 开销和性能。
  • @MeknessiHamida:有点乱。此外,您无法在 Android 7.0+ 的清单中注册 CONNECTIVITY_ACTION
【解决方案2】:

您的意图键不同 这里你的关键是“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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2011-04-14
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    相关资源
    最近更新 更多