显示AlertDialog框时出现“WindowManager $ BadTokenException”?

时间:2012-08-31 14:34:57

标签: android alertdialog broadcast

我正在尝试使用我的应用中的BroadcastReceiver获取互联网连接状态。如果没有可用的互联网,我想显示一个AlertDialog框。

这是我的BroadcastReceiver:

   public class ConnectivityChangedReceiver extends BroadcastReceiver{

  @Override
  public void onReceive( Context context, Intent intent )
  {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
    } else {
        showInternetAlertDialog(context);
    }
  }

  public void showInternetAlertDialog(Context context){
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setMessage("You have no internet connection.")
                    .setPositiveButton("Retry", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                                dialog.dismiss();
                            }
                        }
                    });
        builder.show();
        return;
    }    
 }

我也在我的清单中定义了这个接收器。我已经定义了在清单中访问网络状态的权限。

    <receiver android:name="com.lisnx.service.ConnectivityChangedReceiver"
        android:label="NetworkConnection">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
        </intent-filter>
    </receiver>

但是当互联网消失并且AlertDialog框试图打开时,我得到以下异常:

  10-19 16:25:21.474 E/AndroidRuntime( 6864): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

  10-19 16:25:21.474 E/AndroidRuntime( 6864):     at android.view.ViewRoot.setView(ViewRoot.java:509)

  10-19 16:25:21.474 E/AndroidRuntime( 6864):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)

  10-19 16:25:21.474 E/AndroidRuntime( 6864):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)

  10-19 16:25:21.474 E/AndroidRuntime( 6864):     at android.app.Dialog.show(Dialog.java:241)

我认为这是一个上下文的问题,但我无法找出究竟是什么问题。请帮帮我。任何解决方案将不胜感激。提前完成。

1 个答案:

答案 0 :(得分:1)

无法从AlertDialog

显示BroadCast Receiver.

您必须从BroadCast Receiver开始一些活动,并且在该活动中您必须显示AlertDialog。

您可以将Dialog主题设置为activity,也可以为该活动提供透明布局。

修改:

确保使用FLAG_ACTIVITY_NEW_TASK意图标记开始新活动。