《第一行代码》BroadcastBestPractice中出现的问题及解决方案(关于AlertDialog系统对话框的使用)

该程序为《第一行代码》中的一个小demo,意在学习使用广播实现强制下线功能。

按《第一行代码》中的源码编写ForceOfflineReceiver类,用于接收广播并处理,代码如下:

public class ForceOfflineReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(final Context context, Intent intent) {

        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
        dialogBuilder.setTitle("warning");
        dialogBuilder.setMessage("You are forced to be offline. Please try to login again.");
        dialogBuilder.setCancelable(false);
        dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                ActivityCollector.finishAll();
                Intent startLoginIntent = new Intent(context, LoginActivity.class);
                startLoginIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(startLoginIntent);
            }
        });

        AlertDialog alertDialog = dialogBuilder.create();
        alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT );
        alertDialog.show();

    }
}

由于在ForceOfflineReceiver中弹出了一个系统级别的对话框,所以必须在AndroidManifest中声明如下权限:

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

但编写完成后运行程序点击发送广播后,在接收到广播并处理时,执行alertDialog.show()出错,无法弹出系统对话框且程序直接崩溃。

出错信息为:Unable to add window [email protected] -- permission denied for this window type

解决办法如下:

  若API>=19,不要使用WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,可使用WindowManager.LayoutParams.TYPE_TOAST

  即修改倒数第二行代码为:

alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);

之后再运行程序即可正常弹出系统对话框

时间: 2024-10-19 22:40:28

《第一行代码》BroadcastBestPractice中出现的问题及解决方案(关于AlertDialog系统对话框的使用)的相关文章

Android 入门级教程 《第一行代码》 中遇到的问题

1.自定义ToolBar时,我们需要把ActionBar关掉,因此我们通常会加如下代码: <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> 使用自定义标题时需要关闭系统的一些设置以避免发生bug 不同的Android版本之间会发生一些函数,以及代码逻辑的变化,在编程是要格外注意 <resources&g

《第一行代码:Android》读书笔记——第1章 Android系统

(一)Android系统架构 1.Linux内核层:各种底层驱动,如显示驱动.音频驱动.电源管理等. 2.系统运行库层:各种库支持,如3D绘图.浏览器内核.数据库等. 3.应用框架层:各种API,各种Manager. 4.应用层:所有的应用程序. (二)安卓系统级功能 1.四大组件:Activity,Service,Broadcast,Content Provider. 2.系统控件:用于写界面,也可以自己定制界面. 3.SQLite数据库:轻量级.快速的嵌入式关系型数据库. 4.地理位置定位:

《第一行代码》添加百分比布局库依赖问题

错误条件 按照<第一行代码>中操作,给app模块添加依赖:compile 'com.android.support.percent:24.2.1',gradle同步的时候报出以下错误: ERROR: Failed to resolve: com.android.support.percent:24.2.1: Affected Modules: app WARNING: Configuration 'compile' is obsolete and has been replaced with

Android开发——《第一行代码》自学中

大学时候学过C++,Java,算法,数据结构以及其他很多东西,但都学的不精.就要毕业照工作了,总要专注于一门技术,于是开始学安卓. 开发环境是在慕课网下的eclipse. <第一行代码>这本书我也才只看了不到一半,学到第五章广播,但犯过很多错误,抛出来嘲笑下以前的自己,大家引以为戒. 1 有安卓手机就不要用模拟器 由于各种教程都在使用安卓模拟器,导致我一开始学习也在用.但这个实在是很麻烦,我的电脑本来就是渣配置,模拟器开机就要等一年,开机后点个按钮都要等半天.而且经常卡的我的eclipse都不

跟刷 《 Android Studio 单刷第一行代码》 记录坑

跟刷系列   Android Studio 单刷第一行代码 原帖地址http://www.cnblogs.com/DebugLife/p/4355687.html 记录自己的失误,也算是个督促自己了. 1. 坑--去除标题栏 在 Activity 的 onCreate()方法中添加 requestWindowFeature(Window.FEATURE_NO_TITLE);

HTML5&CSS3初学者指南(1) – 编写第一行代码

介绍 网络时代已经到来.现在对人们来说,每天上网冲浪已经成为一种最为常见的行为. 在网页浏览器中输入一段文本地址,就像http://www.codeproject.com,等待一下,网页就加载到浏览器窗口中.一个典型的网页是由文本.图像和链接组成的.除去内容上的差异,不同网站的网页也具有不同的外观和感受,以实现在网络上建立自己的身份品牌的目的. 如果你也曾想要了解你屏幕上的这些网页是如何被创建出并以各式各样的方式渲染的,那么这里正是你可以了解到这些知识的地方.让我们一起走进在浏览器中创建了这么多

安卓模拟聊天界面---改编第一行代码

主界面 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:

第一行代码----android篇1.0:活动

   做.NET有4年了,最近由于个人兴趣开始学习Android,网上看了下,郭霖老师的”第一行代码“不错,就以此为教程,写个博客,希望共勉吧!   1:活动是什么及其基本用法    活动是什么,英文名称是“Activity”,专业定义是“一种可以包含用户界面的组件,主要用于和用户进行交互”.在我看来就是.net中的aspx页面,但又不完全是.    如何建立?    如上图所示,点击上图Browse       点击ok,建立活动.活动建立显示的初始页面如下. 到此,建立活动,其实就是一个类,

《第一行代码——Android》封面诞生记

<第一行代码——Android>已经上市快一个月了,目前销售情况还算良好,也是特别感谢众多朋友的支持.其实一本书如果想要卖的好,除了内容必 须要给力之外,封面的设计也是至关重要的,而本书的封面无疑是在充实的内容之外又披上了一层华丽的外衣.作为作者,其实我的任务就是将内容写好而已,其它 所有相关工作都不是由我负责的.本书封面设计的所有细节都是由陈冰先生一手抓起的,之后他在图灵社区上记录了本书封面的诞生过程.在经过他同意的情况下, 我将这篇文章转到我的博客上,也是让感兴趣的朋友们了解一些不为人知的