在Service中弹出对话框

我们知道,平常使用的dialog是依赖于activity的,那么我们是否可以在Service中使用dialog弹出框呢?

但是我们也知道,系统在比如电量过低,或者按下关机键时,不论在那个界面,都会弹出系统级对话框。

所以从理论上来说是可以的。

在Service中弹出对话框常用的方法如下:

AlertDialog dialog = alertDialog.create();
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.show();
还需在AndroidManifest.xml文件中添加如下权限:

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


不过,很遗憾,在Android6.0上,运行后闪退显示如下错误:

java.lang.RuntimeException: Unable to create service com.science.test.MyService: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@aa4c25e -- permission denied for this window type

这是因为google在6.0上对应用权限进行了优化,需要单独开启:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (!Settings.canDrawOverlays(this)) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                Uri.parse("package:" + getPackageName()));
        startActivityForResult(intent, 1);
    }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (!Settings.canDrawOverlays(this)) {
                // SYSTEM_ALERT_WINDOW permission not granted...
            }
        }
    }
}

第一次安装进入到该界面时,需要跳到如下界面:



不过在MIUI中,问题比较多。

无论是基于Android6.0,5.x,4.4的MIUI中(手上只有4.4+版本的MIUI8,MIUI7貌似~也差不多),在给dialog弹窗添加TYPE_SYSTEM_ALERT,且不添加Settings.canDrawOverlays(this)时,MIUI对弹窗做了权限控制,默认关闭(基于Andorid6.0不会FC,因为MIUI没有使用原生的权限管理):



所以,以上方法不是最好的。

但是,我们知道原生Toast是不需要权限就能显示的,是否可以把TYPE_SYSTEM_ALERT改为TYPE_TOAST呢?很遗憾,MIUI中还是默认关闭,而其他(包括Android6.0)可以正常显示(不再需要在程序清单文件里添加权限)。

不过,既然原生Toast可以不需要权限且在任意系统上可以显示,就说明肯定可以有办法,没错,就是对Toast进行扩展封装,解决办法如下博客:

http://blog.csdn.net/xyq046463/article/details/51840586

当然,还有一个办法,那就是直接跳转到一个dialog类型的Activity,简单粗暴大笑


参考:

http://stackoverflow.com/questions/32061934/permission-from-manifest-doesnt-work-in-android-6

http://blog.csdn.net/xyq046463/article/details/51840586

http://www.liaohuqiu.net/cn/posts/android-windows-manager/

http://www.jianshu.com/p/634cd056b90c


本人水平有限, 如有错误, 欢迎指正, 以免误导他人奋斗

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值