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

申祷无 2017-07-27 06:49:39
加格式太麻烦,想看高亮请看这个:
https://segmentfault.com/q/1010000010380701

我调试过了,确实执行到 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);
}
...全文
184 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
水手辛巴 2017-08-01
  • 打赏
  • 举报
回复
就是线程阻塞的问题,如果pm.isScreenOn()是True那么你这个循环不会结束,会一直阻塞主线程。然后关屏和开屏又会触发这个广播,看起来你是想搞得流氓一点,弄了个while来弹出对话框。
澜、 2017-08-01
  • 打赏
  • 举报
回复
dialog.isShowing()判断下
androidzmm 2017-07-31
  • 打赏
  • 举报
回复
额。。。这不是放在while里面就不显示了。。是因为你while(true),这是个死循环。。。你在while的里面
打个log。就可以看到。
接收到一个广播就会一直在while的这个循环里面。况且。。这个广播我测试了下。。还不止接收到一次。。。这个情况下。。应该会出现程勋无响应吧。。
综上所述。。是因为你的while里面是个死循环。。。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧