简体   繁体   English

无法添加窗口 - 令牌null不适用于广播接收器的OnReceive内的应用程序

[英]Unable to add window — token null is not for an application inside OnReceive of Broadcast Receiver

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.

I'm checking wifi or data connectivity service and if not available I'm alerting the user. 我正在检查wifi或数据连接服务,如果没有,我正在提醒用户。

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>

Can someone help me out how to resolve the exception, and why is the exception occurring twice? 有人可以帮我解决如何解决异常,为什么异常发生两次?

Just removing my receiver from manifest.xml solved my issue. 从manifest.xml中删除我的接收器解决了我的问题。 Thanks. 谢谢。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM