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. 

我檢查無線網絡連接或數據連接服務,如果沒有可用的,我提醒用戶。無法添加窗口 - 令牌null不是廣播接收器的內部的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

[How to raise a alert dialog from BroadcastReceiver class?](http://stackoverflow.com/questions/7229951/how-to-raise-an-alert-dialog-from-broadcastreceiver-class) –

+1

它發生了兩次,因爲你在兩個地方註冊了Receiver;清單和「活動」。 –

+0

在我的活動中,我有20個其他片段。每次用戶移動到其他片段時,我都想顯示警告對話框。但是它只有在onResume被稱爲一次時顯示。如果我移動到其他片段,我想要再次彈出警告,然後關閉我的警報對話框。任何想法如何做到這一點?我是否需要註冊所有片段? – DroidDev

回答

0

剛剛從manifest.xml中刪除我的接收器解決了我的問題。謝謝。

相關問題