2017-09-14 59 views
-2

我有一個廣播接收器可以檢測應用程序是否連接到互聯網,併發送帶有額外字符串的意圖。但是,我得到一個空超:當從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

回答

2

但我得到額外

空的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操作系統它。你有兩個接收者,因爲你在清單中聲明瞭一個,而在你的活動中聲明瞭一個。 –

1

你的意圖重點是不同的 在這裏,你關鍵是 「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");