解决在BroadcastReceiver(广播接受者)中不能添加AlertDialog(对话框)的问题(android.view.WindowManager$BadTokenException)

在BroadcastReceiver,当我们创建一个AlertDialog并show出来的时候,出现了下面的错误:

12-24 14:10:57.025: E/AndroidRuntime(17600): java.lang.RuntimeException: Unable to start receiver com.ustc.broadcastreceiver.ForceOfflineReceiver: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

下面的方法可以解决:

第一步:

在调用show方法之前,设置下面的属性:

dialog.getWindow()
				.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

再次运行,发现程序又挂了:

12-24 14:15:22.793: E/AndroidRuntime(17979): java.lang.RuntimeException: Unable to start receiver com.ustc.broadcastreceiver.ForceOfflineReceiver: android.view.WindowManager$BadTokenException: Unable to add window [email protected] --
permission denied for this window type

这个一看就知道了,权限拒绝,需要添加权限:

第二步:

在清单文件中添加权限:

 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

这样运行就OK了,我的代码如下:

package com.ustc.broadcastreceiver;

import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.view.WindowManager;

public class ForceOfflineReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(final Context context, Intent intent) {

		AlertDialog.Builder builder = new Builder(context);
		builder.setTitle("提示");
		builder.setMessage("强制下线");
		builder.setCancelable(false);
		builder.setPositiveButton("ok", new OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {

				ActivityCollector.finishAll();
				Intent intent = new Intent(context, LoginActivity.class);
				intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
				context.startActivity(intent);

			}
		});
		AlertDialog dialog = builder.create();

		dialog.getWindow()
				.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

		dialog.show();
	}

}
时间: 2024-11-14 18:32:59

解决在BroadcastReceiver(广播接受者)中不能添加AlertDialog(对话框)的问题(android.view.WindowManager$BadTokenException)的相关文章

解决Eclipse的Servers视图中无法添加Tomcat6/Tomcat7

如何解决 1. 关闭Eclipse 2. 打开WorkSpace所在的位置. {workspace-directory}/.metadata/.plugins/org.eclipse.core.runtime/.settings 删除以下文件 org.eclipse.wst.server.core.prefs org.eclipse.jst.server.tomcat.core.prefs 3. 重启 Eclipse,即可.

[Android Pro] service中显示一个dialog 或者通过windowmanage显示view

转载: http://blog.csdn.net/huxueyan521/article/details/8954844 通过windowmananger来在窗口上添加view的时候,需要设置alert参数,而且要添加alert权限 mLayoutParams = new WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, LayoutParams.TYPE_SYSTEM_ALERT,

ecshop新版不能在模板文件.dwt和.lbi中直接添加php代码的解决方法

ecshop新版不能在模板文件.dwt和.lbi中直接添加php代码了,为什么呢? 因为直接在模板中加入php函数和代码,没有经过过滤,容易造成安全隐患.程序源码安全是非常重要的. 不过如果有朋友希望能在模板文件中直接加入php代码,怎么办呢? 其实,只需要改动一个文件,即includes/cls_template.php 打开此文件,找到函数 function fetch_str($source) 在此函数中找到,大概在288行 if(preg_match_all('~(<\?(?:\w+|=

ecshop不能在模板文件.dwt和.lbi中直接添加php代码的解决方法

ecshop不能在模板文件.dwt和.lbi中直接添加php代码了,为什么呢? 因为直接在模板中加入php函数和代码,没有经过过滤,容易造成安全隐患.程序源码安全是比较重要的.不过如果有朋友希望能在模板文件中直接加入.dwt和.lbi文件,怎么办呢?需要改动哪些文件呢?其实,需要改动一个文件,即includes/cls_template.php打开此文件,找到函数 function fetch_str($source)在此函数中找到 if(preg_match_all('~(<\?(?:\w+|

Android08_广播接受者_服务

1 广播接受者  广播的发送是通过intent开启的 需要被接收的广播:电量不足,sd卡被移除,电话移除,短信到来等等 1.1 监视sd卡的状态 需求:监视sd卡的状态,并提示用户受到影响的功能. 步骤:①买个收音机 创建一个类,继承BroadcastReceiver类(可以看做当一个类继承了该类,如果sd卡发生状态改变会接收到一条信息?) ②装上电池 在清单文件中配置 <receiver>标签(接受者) 配置属性name=”全包名”一定要配置到对应的类,不然会报错 ③调到对应频道 在rece

broadcastReceiver广播基础demo介绍

andriod的BroadcastReceiver介绍 编辑删除 作者:一座城一颗努力的心2016-07-12 00:24分类:默认分类标签: 科技 IT软件 broadcastReceiver开发步骤: 1  创建需要启动的BroadcastReceiver的Intent 2  调用context中的sendBroadcast或者sendOrderedBroadcast()方法来启动指定的广播接受者(BroadcastReceiver) 需要注意的是:当应用程序发出一个boradcastRec

Android组件系列----BroadcastReceiver广播接收器

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3960623.html 联系方式:[email protected] [正文] 一.广播的功能和特征 广播的生命周期很短,经过调用对象-->实现onReceive-->结束,整个过程就结束了.从实现的复杂度和代码量来看,广播无疑是最迷你的Android 组件,实现往往只需几行代码.广播对象被构造出

Android 学习笔记 BroadcastReceiver广播...

PS:不断提升自己,是件好事... 学习内容: 1.BroadcastReceiver的使用.. 2.通过BroadcastReceiver去启动Service... 1.BroadcastReceiver...   广播接收者,用来接收系统和应用中的广播...Android广播机制用的地方还是很多的,比如说:当网络状态发生改变的时候,通过接收这条广播就能及时做出相应的响应,然后完成一些操作..这就是广播的机制...它自身并不实现图形用户界面...只是一个触发性的操作...   使用广播是需要几

25短信指令的广播接受者

这里创建一个短信广播接受者,并让他的优先级最大,设置他的动作为:接收短信(需要添加权限) <receiver android:name="com.ustc.mobilemanager.receiver.SMSReceiver" > <intent-filter android:priority="1000"> <action android:name="android.provider.Telephony.SMS_RECEIV