1. 程式人生 > >解決在BroadcastReceiver(廣播接受者)中不能新增AlertDialog(對話方塊)的問題(android.view.WindowManager$BadTokenException)

解決在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();
	}

}


相關推薦

解決BroadcastReceiver廣播接受者不能新增AlertDialog對話方塊的問題android.view.WindowManager$BadTokenException

在BroadcastReceiver,當我們建立一個AlertDialog並show出來的時候,出現了下面的錯誤: 12-24 14:10:57.025: E/AndroidRuntime(17600): java.lang.RuntimeException: Unable

MFC 給DLL新增的CDialog對話方塊新增OnInitDialog()初始化函式

新建MFC DLL專案,新增Dialog對話方塊之後,對話方塊實現檔案裡找不到對話方塊的初始化函式OnInitDialog(),這時,需要我們手動的新增重寫函式。步驟如下:專案【類檢視】中右鍵單擊對話方

解決下載ftp文件過程,瀏覽器直接解析文件txt,png等的問題

filename map 需要 etc home 3.0.0 var att esp 搭建了一個ftp服務器,供用戶進行上傳下載,在下載過程中發現,一些文件,例如txt,jpg,png,pdf等直接被瀏覽器解析了。在瀏覽器中顯示其內容,沒有下載。 下面通過網上查詢得到一些解

在uboot新增屬於我們自己的板卡board

CONFIG_ARM=y CONFIG_ARCH_DAVINCI=y CONFIG_TARGET_OMAPL138_639=y CONFIG_SPL_LIBCOMMON_SUPPORT=y CONFIG_SPL_LIBGENERIC_SUPPORT=y CONF

leaflet 在地圖popup彈框新增按鈕並點選響應vue2leaflet,設定popup的content屬性,新增button

效果如圖,點選【進入】按鈕,彈出alert提示框。當然這裡可以把alert換成其他響應需求。  首先給popup的content新增button: <l-popup :content="profile1-1+ '<br><button id=

虛擬機器vmware新增新的硬碟

虛擬機器中的系統執行一段時間後,空間可能會不足,因此需要向其追加硬碟空間,以下便是增加空間的方法。 操作環境:VMware® Workstation 12 Pro                    CentOS 6.7 minimal                  

Solr4.x4.7.0新增Solr例項(Core)

在下載的solr的解壓包的事例中,預設只有一個Core(collection1),如果想新增自己的Core,比如我想新增一個Core(item),可以使用如下的步驟: 1. 在Solr的Home目錄的solr目錄中建立資料夾item(在C:\solr-tomcat\solr中建立item). 2.在新

通過VBA在Excel新增選單和選單項按鈕Excel啟動時候新增

將以下程式碼儲存到.xlam或.xla(Excel97-2003)檔案。 在ThisWorkBook物件中,新增Workbook_Open事件,呼叫啟動選單過程。 Private Sub Workbook_Open() Call MenuSetup(True) E

PythonPandas map, applymap and apply的區別記住作用物件:dataframe的列,每一個元素,series每一個值

1.apply() 當想讓方程作用在一維的向量上時,可以使用apply來完成,如下所示 In [116]: frame = DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio'

iOS開發 - 不小心刪除了Copy Bundle Resources怎麼辦?多人開發頻繁新增刪除圖片導致圖片路徑重複,編譯報錯

Copy Bundle Resources在iOS中至關重要,如果一不小心刪除了這一項,整個工程就廢了,無法執行。Copy Bundle Resources存在於Build Phases中,一般來說很少會有人注意到它,即使不小心刪除了也很難發現少了什麼,何況是不小心刪除的,就更不知道怎麼

解決方案】VS2013外部工具新增ildasm.exe

VS2013安裝在Win8.1的作業系統中,開始螢幕中找不到ildasm.exe沒有顯示,於是下面提供了一種方法將ildasm.exe工具新增到VS2013外部工具中,並將反編譯的程式碼輸出到VS2013的輸出視窗。 1.ildasm.exe 工具路徑:C:\Program

asp.net的彈出對話方塊舟無泊總結

在編寫程式時,有時候我們希望程式在執行時,能彈出對話方塊,給使用者一些提示,特別是對於一些錯誤錯操作的提示和重要資訊修改的確認提示。 (1)提示對話方塊:也就是對使用者的操作作一些提示,它是一個只帶有“確定”按鈕的模式對話方塊。這種對話方塊比較簡單,在需要提示的地方寫上如下程

關於如何去除fckeditor圖片上傳對話方塊的連結和高階兩個選項轉帖

 今天老闆要求修改一個網站後臺的編輯器,原因是原來的編輯老出問題,不好用。於是我就找了個現在很流行的fckedior來作為後臺的編輯器。    在做的過程中我碰到一個配置問題,上google上google搞了很久才成功。這個配置就是把圖片上傳對話方塊中的瀏覽器伺服器中的檔案功

二叉樹的深度優先dfs遍歷前序、序和後序;遞迴與非遞迴

//前序遍歷 //遞迴實現:根左右 void preOrder1(BinTree *root) { if (root != NULL) { cout<<root->data<<endl; preOrder1(root->lch

Android 對話方塊總結確定取消,單選,多選,進度條,具體的進度條

/** * 彈出確定取消對話方塊 * * @param view */ public void click01(View view) { // 工廠設計模式,得到建立對話方塊的工廠 AlertDialog

MFC程式主、子對話方塊類之間獲取CSocket類物件出錯問題解析:error C2248: “CSocket::CSocket”: 無法訪問 private 成員(在“CSocket”類宣告

(1)錯誤描述:在MFC程式中主對話方塊類利用網路套接字CSocket類和下位機進行通訊;在MFC程式中子對話方塊類想要獲取主對話方塊類的網路套接字變數時,可以通過 CMainDlg* parent;  //指向主對話方塊的指標 獲取到主對話方塊的指標進而獲取到指向套接字

MFC對話方塊如何使用工具欄並修改工具欄的背景顏色與自繪對話方塊統一

    寫這篇文章只是為了解決我上一篇文章遺留的一個問題,本來覺得這個問題可以不用管,但是在我寫的程式中發現並不能置之不理,先來重現這個問題     工具欄有一部分沒有繪上     看紅色框包圍的地方,是背後 VS2010 的介面,因為程式擦成透明的啦,上一篇文章我錯誤

VS2013 MFC基於對話方塊程式設計建立工程

一、新建MFC專案 選擇:基於對話方塊MFC的使用:  在共享DLL中使用MFC (程式執行需要dll)  在靜態庫中使用MFC (程式較大,執行時不需要dll) 設定MFC程式主框架樣式和標題  高階功能  若是用不上“ActiveX控制元件”可以去掉勾選,若要涉及

jquery+css實現自定義對話方塊功能不使用外掛

當今網路上各種jquery對話方塊外掛層出不窮,可是我為什麼要放棄這些外掛選擇自己使用jquery和css來自定義對話方塊的呢?有兩方面的原因,一個是有利於自己更加深入的瞭解css和jquery的特性,另一方面也可以更加的相容自己的專案。這裡面有幾個關鍵性的技術點,但是我們

kotlin實現Android實現底部對話方塊BottomDialog圓角,直角

本文借鑑秀原始碼:http://www.xiufm.com/thread-15571-1-3.html 圖片借鑑秀原始碼gif 先來看main.java class Main3Activity : AppCompatActivity() { private