当从BroadCast发送意图时没有额外的空格

问题描述:

我有一个广播接收器可以检测应用程序是否连接到互联网,并发送带有额外字符串的意图。但是,我得到一个空超:当从BroadCast发送意图时没有额外的空格

这是广播接收器

  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。

编辑

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

+0

你可以分享你的Androidmanifest.xml文件吗 –

+0

所以你传递的关键'cnx的数据和获取'internet'。当然它将会是空的。 –

+0

这就是我搞砸了几个更正后,即使使用正确的密钥它仍然为空 – MeknessiHamida

但我得到额外

空的Android不具有"internet""cnx"额外对Intent。而且,你正在创造一个无限循环。

  1. 系统发送一个CONNECTIVITY_ACTION广播。

  2. 您有两台接收机注册了该广播,并且都收到广播,没有"internet""cnx"多余。

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

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

  5. 一个接收器重新将"cnx"额外添加到CONNECTIVITY_ACTIONIntent并发送广播。

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

  7. 一个接收器重新将"cnx"额外添加到CONNECTIVITY_ACTIONIntent并发送广播。

  8. 泡沫,漂洗,重复

首先,对于一个应用程序的一个单一的过程中沟通做使用的系统广播。使用LocalBroadcastManager

二,做不是发送广播与系统Intent行动。充其量,你搞砸了设备上的很多其他应用程序。最糟糕的是,你会崩溃,因为系统阻止你发送该广播。

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

+1

能否请你解释一下:'首先,不要在应用程序的单个进程中使用系统广播进行通信。使用LocalBroadcastManager.'。为什么我们不应该使用它:)。 –

+0

我改正了钥匙却没有任何东西,它是怎样的两个接收器?现在我正在从一项活动中接收它并从现在的所有活动中接收它,它是否仍算作系统广播? – MeknessiHamida

+3

@MeknessiHamida您期望收到的事件BroadcastReceiver是一个系统调度事件,这意味着它不是您的应用程序广播它,而是Android操作系统它。你有两个接收者,因为你在清单中声明了一个,而在你的活动中声明了一个。 –

你的意图重点是不同的 在这里,你关键是 “CNX”

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

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

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

您可以通过 “互联网” 这里的关键

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

将其更改为retriving:

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