1
I'm trying to implement a scenario, if my application loses internet connectivity I'm posting a alert dialog to the user. 

I'm planning to use Broadcast receiver to check internet connectivity in my app by using register and unregister in my main activity. 

Here is the code: 

**BroadcastReceiver** class : here I'm checking the internet connectivity. 

Я проверка Wi-Fi или подключения к данным службы, и если нет в наличии, я предупреждая пользователя.Невозможно добавить окно - маркер нуль не для применения внутри OnReceive вещательного приемника

public class NetworkChangeReceiver extends BroadcastReceiver { 

    private static final String TAG = "ConnectionReceiver"; 

    private AlertDialog alertDialog; 

    public NetworkChangeReceiver() { 
    } 

    @Override 
    public void onReceive(final Context context, final Intent intent) { 
     if (intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE")) { 
      ConnectivityManager cm = 
        (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

      NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
      boolean isConnected = activeNetwork != null && 
        activeNetwork.isConnectedOrConnecting(); 
      if (isConnected) { 
       try { 
        if (alertDialog != null && alertDialog.isShowing()) 
         alertDialog.dismiss(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } else { 
       if (alertDialog == null || !alertDialog.isShowing()) { 
        AlertDialog.Builder builder = new AlertDialog.Builder(context); 
        builder.setTitle("No internet connection"); 
        builder.setMessage("check your connection."); 
        builder.setPositiveButton(context.getString(R.string.confirm_button_text), new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int which) { 

           } 
          }); 
        alertDialog = builder.create(); 
        alertDialog.show(); 
       } 
      } 
     } 
    } 
} 



**And in my Activity I'm registering the broadcast receiver.** : 

public class MyActivity extends Activity { 

    private NetworkChangeReceiver networkChangeReceiver = new NetworkChangeReceiver(); 

@Override 
    protected void onResume() { 
     super.onResume(); 
     registerReceiver(networkChangeReceiver, new IntentFilter(
       "android.net.conn.CONNECTIVITY_CHANGE")); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     unregisterReceiver(networkChangeReceiver); 
    } 

} 


When I put my phone in airplane mode , alert dialog pops up and after 2 seconds my app gives an "Unable to add window -- token null is not for an application " exception. and this exception occurs 2 times. 

**here is my log**: 

AndroidRuntime: FATAL EXCEPTION: main Process: , PID: 9923 java.lang.RuntimeException: Unable to start receiver xxxx.NetworkChangeReceiver: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 

Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 


My **Manifest** file: 

<application 
     android:name="xxxxx" 
     android:allowBackup="true" 
     tools:replace = "android:icon" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme"> 

     <receiver android:name=".xxx.NetworkChangeReceiver" > 
      <intent-filter> 
       <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
       <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> 
      </intent-filter> 
     </receiver> 


<activity 
      android:name="xxxx" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 

       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 

    </application> 

Может ли кто-нибудь помочь мне решить, как разрешить исключение, и почему исключение происходит дважды?

+0

Возможный дубликат [Как поднять диалоговое окно предупреждения из класса BroadcastReceiver?] (Http://stackoverflow.com/questions/7229951/how-to-raise-an-alert-dialog-from-broadcastreceiver-class) –

+1

Это происходит дважды, потому что вы регистрируете приемник в двух местах; манифест и «активность». –

+0

В моей деятельности у меня есть еще 20 фрагментов. Я хочу показывать диалоговое окно предупреждения каждый раз, когда пользователь переходит к другому фрагменту. Но его единственное отображение, когда onResume называется i.e один раз. После того, как я закрою свой предупреждающий диалог, если я перейду к другому фрагменту, я хочу снова открыть предупреждение. Есть идеи, как это сделать? Нужно ли регистрироваться во всех фрагментах? – DroidDev

ответ

0

Просто удалив мой ресивер из manifest.xml, я решил проблему. Благодарю.