现在遇到一个需求,在网络从wifi切换到别的网络的时候弹出一个对话框,然后静态的注册了一个广播,但是弹出遇到问题,原来做过账号的强制退出,使用的是这个
alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
要在show之前 create之后添加,将其设置成一个系统的dialog,
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"></uses-permission>
这个权限也要加上,
原因:
但是静态注册里, 如果没声明android:process,那么这个BroadcastReceiver和Activity是在同一个进程的,显然BroadcastReceiver的生命周期和当前的Application不是绑定的,那么这个BroadcastReceiver运行的空间就应该在某个系统服务而不是当前进程中。结合“设置了TYPE_SYSTEM_ALERT属性”是典型的在service中构造Alertdialog的方法这一点,很显然此时onReceive()里传入的context实际上是这个BroadcastReceiver所在的系统服务。
然而,我的手机还是没能弹出来,,比较无语,最后上网上看了下发现是google 在 6.0加入了运行时权限的概念,需要在java代码中进行动态申请。
一个比较好的资料:https://github.com/CankingApp/PermissionDemo
然后解决方法:
一丶google为了防止旧的应用程序崩溃只对targetSDK为23及以上的程序使用新的权限机制,所以targetSDK设为23以下就可以规避问题了 但是感觉不好
二丶在设置里面给了这个调试应用【允许悬浮窗】 但是得手动的打开,而且,我使用的是 米UI,就是打开了也没什么用
然后问题没有解决,我就想使用dialog样式的activity来做,但是还是弹不出来(弹的时候要加上 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
这个标记,不然会报错。但是,还是没用,6.0以上弹不出来,我测试的4.2的系统就可以。
最后,我上去找了几个应用,看了下他们的网络监控,,爱奇艺我下载直接弹了个Toast , 优酷 没有显示,我wifi切换到4g,什么都没提示,继续下载。。
so,和老大商量了下,也弹了个Toast提醒。。。