2017-09-14 12 views
-2

私は、アプリケーションがインターネットに接続されているかどうかを検出し、余分な文字列でインテントを送信するブロードキャスト受信機を持っています。しかし、私は余分なヌルを取得しています:BroadCastからインテントを送信するときにNullを追加

これは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を意味します。

編集

シナリオは、私は、その実装を無視して、とにかく故障したが、そのような場合には、優れたキーを確認しました。

+0

あなたのAndroidmanifest.xmlファイルを共有できます –

+0

あなたはキー 'cnx'でデータを受け渡しています'インターネット'。もちろん、それはnullになるだろう。 –

+0

正しいキーがまだヌルであっても、いくつかの訂正をしてもうまくいきません。 – MeknessiHamida

答えて

2

しかし、私はAndroidがそのIntent"internet"または"cnx"余分を持っていない

余分なヌルを取得しています。そして、あなたは無限ループを作り出しています。

  1. システムは、ブロードキャストCONNECTIVITY_ACTIONを送信します。

  2. ブロードキャストに2つの受信者が登録されていて、いずれもブロードキャストを受信して​​います("internet"または"cnx"の追加なし)。

  3. CONNECTIVITY_ACTIONIntentには、"cnx"が追加され、ブロードキャストが送信されます。

  4. ブロードキャスト用に2つの受信者が登録されていて、どちらもブロードキャストを受信して​​います("cnx"追加)。

  5. CONNECTIVITY_ACTIONIntentに余分に"cnx"を追加してブロードキャストを送信します。

  6. ブロードキャスト用に2つの受信者が登録されていて、どちらもブロードキャストを受信します("cnx"追加)。

  7. CONNECTIVITY_ACTIONIntentに余分に"cnx"を追加してブロードキャストを送信します。

  8. 泡、リンス、APPの単一のプロセス内で通信するためのない利用システムブロードキャストを行い、

まず繰り返します。 LocalBroadcastManagerを使用してください。

第2に、ではないは、システムIntentアクションでブロードキャストを送信します。最高でも、あなたはそのデバイス上で他の多くのアプリを台無しにします。システムがそのブロードキャストを送信するのを妨げるため、最悪の場合、クラッシュします。

また、as Burhanuddin pointed outの場合は、別のキーで同じキーを使用していません。

+1

あなたはこれを説明できますか?まず、アプリケーションの1つのプロセス内での通信にシステムブロードキャストを使用しないでください。 LocalBroadcastManager.'を使用します。なぜ我々はそれを使用すべきではありませんか:)。 –

+0

私は鍵を訂正しましたが、何もありません。どのように2つの受信機ですか?今は1つのアクティビティからそれを受け取り、現在のすべてのアクティビティからそれを受け取るようになりましたが、それでもシステムブロードキャストとしてカウントされますか? – MeknessiHamida

+3

@MeknessiHamidaあなたがBroadcastReceiverで受け取ろうとしているイベントはシステムディスパッチイベントです。つまり、アプリをブロードキャストするのではなくAndroidオペレーティングシステムです。あなたはマニフェストに1つ、あなたの活動に1つを宣言したので、2つの受信者があります。 –

1

あなたの意思鍵はここでキーが "CNX"

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

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

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

異なっているあなたは、 "インターネット" キーでretrivingされ、ここで

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

に変更し、それを:

String val=intent.getStringExtra("cnx"); 
関連する問題