gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:11:47 26 4
gpt4 key购买 nike

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.

我正在检查 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>

有人可以帮我解决该异常吗?为什么异常会发生两次?

最佳答案

只需从 manifest.xml 中删除我的接收器就解决了我的问题。谢谢。

关于java - 无法添加窗口 - token null 不适用于广播接收器 OnReceive 内的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39797857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com