Service运用,在任意Activity弹框

因项目需求,在接收到通知后,不论App在哪一个Activity,都要弹框显示通知内容。所以想到的好一点的方法就是用service。因为service可以在后台进行一些操作,结合通知,当收到推送通知时,弹框提醒用户。

但是Dialog是依附于Activity存在的,它是无法直接在service中启动打开的,否则会报错误:Android.view.WindowManager$BadTokenException:Unable to add window

解决方法一种是,弹一个全局性的弹框,即:弹框是全局性的,这种Dialog不响应home键和返回键,也就是说这样就强制用户必须对Dialog作出操作;另一种就是跳转到一个Activity。我选择的是使用Dialog。至于Dialog的定义按照常规定义就好,使用时要在dialog.show()语句之前设置dialog的window的type是system alert型。即:

dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);  
dialog.show();  

另外还要在AndroidManifest.xml中配置权限

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

在保证service正常运行和通知到达的情况下,就可以调起Dialog了。

题外话,在项目中,弹框相关操作,有发起其他Activity的操作,我直接用了context.startActivity,结果就是导致app直接崩溃。
错误提示信息:

Caused by: Android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

因为以前没这么干过,都是直接在Activity中进行界面的跳转,和这次就有区别了,弹框是全局性的,不依附于任何Activity。

于是查了一下这个错误,原因是:activity继承了context重载了startActivity方法,如果在acitvity调用startActivity,不会有任何限制。而如果直接使用context的startActivity则会报上面的错误,根据错误提示信息,可以得知,如果要使用这种方式需要打开新的TASK。
所以,解决方法:

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(intent);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值