申祷无 2017-07-27 09:38 采纳率: 50%
浏览 756
已采纳

为什么 AlertDialog 放到 while 里就不能显示了?

我调试过了,确实执行到 showAlertDialog(context); 了,我在 logcat 里看到了。代码是这样的:

if (pm.isScreenOn()) {
                    Log.v("remind", "show alert");
                    showAlertDialog(context);
                }

在下面那个不能显示的情况下有时候好像会一下子显示出来很多。因为一个对话框只有很少的阴影,因为前面说的那种情况阴影很多,所以可能有很多。然后在这种情况下点击屏幕就没反应了,奇怪的是点击菜单、主页、返回有反应。

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" >
</uses-permission>
BroadcastReceiver mScreenStateReceiver = new ScreenStateReceiver();
IntentFilter screenStateFilter = new IntentFilter();
screenStateFilter.addAction(Intent.ACTION_USER_PRESENT);
registerReceiver(mScreenStateReceiver, screenStateFilter);

下面的不会显示:

public class ScreenStateReceiver extends BroadcastReceiver {

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

                while(true) {
                        try {
                                Thread.sleep(3 * 1000);
                        } catch (Exception e) {
                                System.out.println("Error: " + e);
                        }
                        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);

                        if(pm.isScreenOn()) {
                                showAlertDialog(context);
                        }
                        else
                                return;
                }
        }

        public void showAlertDialog(Context context) {
                AlertDialog.Builder builder;
                builder = new AlertDialog.Builder(context, android.R.style.Theme_Material_Dialog_Alert);
                builder.setTitle("提醒")
                                .setMessage("你正在看的东西有用吗?")
                                .setPositiveButton("有用", new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int which) {
                                                // continue with delete
                                        }
                                })
                                .setNegativeButton("没用", new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int which) {
                                                // do nothing
                                        }
                                })
                                .setIcon(android.R.drawable.ic_dialog_alert);
                AlertDialog alert = builder.create();
                alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
                alert.show();
        }
}

下面这样就能显示了:

 public void onReceive(Context context, Intent intent) {
                try {
                    Thread.sleep(3 * 1000);
                } catch (Exception e) {
                    System.out.println("Error: " + e);
                }
                showAlertDialog(context);
}
  • 写回答

2条回答 默认 最新

  • smile_邝野 2017-07-28 06:28
    关注

    上面的是pm.isScreenOn()为FALSE时,不会执行showAlertDialog(context);
    下面不管什么情况都会执行so 你懂了吗?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已采纳回答 12月20日

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)