问题
集成信鸽推送服务,产品要求在APP前台运行时弹窗消息提示框。小码哥写了个测试程序跑一下,服务端发送透传消息,omg APP居然没有弹窗消息。于是断点调试,接收推送的广播onReceive()代码执行了,弹窗的代码也执行了,但是就是没有弹窗。纠结~~问度娘吧。
原因
出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog)。
解决
按照网上各路大神给的思路,首先AndroidManifest.xml中添加权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
给Dialog设置:
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
掉坑1:
再跑一下程序,结果,OMG 什么玩意啊!还是不弹窗。要哭的赶脚。
掉坑2:
于是,又开始折腾找问题了。竟然还是广播的问题,静态广播和动态广播,呵呵呵..呵…为啥?
掉坑3:
我把接收信鸽推送的静态广播改成动态广播吧,在跑一下程序,我喝一口水(嗯…这下总该可以了),OH NO!居然接收不到信鸽推送广播了,接收信鸽推送的广播是不能写成动态的。那怎么办嘞。
最终解决:
单独注册一个弹窗的动态广播。
总结
广播Dialog弹窗,满足3个条件:
1.权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
2.Dialog设置
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
3.动态注册广播