申祷无 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日

悬赏问题

  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal
  • ¥15 想用@vueuse 把项目动态改成深色主题,localStorge里面的vueuse-color-scheme一开始就给我改成了dark,不知道什么原因(相关搜索:背景颜色)
  • ¥20 OPENVPN连接问题
  • ¥15 flask实现搜索框访问数据库
  • ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备
  • ¥100 如何用js写一个游戏云存档
  • ¥15 ansys fluent计算闪退