浅谈Service中实现弹出对话框的坑
程序员文章站
2022-03-25 18:08:02
一、手机版本问题,大多数文章没有涉及这个点,导致他们的代码并无法正常使用 M版本以上需要使用的Type--> TYPE_APPLICATION_OVERLAY AlertDialog.Builder builder=new AlertDialog.Builder(getApplicationCont ......
一、手机版本问题,大多数文章没有涉及这个点,导致他们的代码并无法正常使用
m版本以上需要使用的type--> type_application_overlay
alertdialog.builder builder=new alertdialog.builder(getapplicationcontext());
builder.settitle("提示");
builder.setmessage("service弹框");
builder.setnegativebutton("明白了",null);
dialog dialog=builder.create();
if (build.version.sdk_int >= build.version_codes.m){//6.0
dialog.getwindow().settype(windowmanager.layoutparams.type_application_overlay);
}else {
dialog.getwindow().settype(windowmanager.layoutparams.type_system_alert);
}
dialog.show();
同时,因为涉及不同版本的android系统
androidmanifest.xml 中声明同时需要这两个类型对应的权限
<uses-permission android:name="android.permission.system_alert_window"/> <uses-permission android:name="android.permission.system_overlay_window" />
二、权限问题,service中弹出的对话框为系统弹框,在m版本以上需要申请悬浮窗权限
android 6.0 以前悬浮窗是默认允许的
注意android 6.0以后的使用
因为悬浮窗权限 system_alert_window 属于特殊权限 ,需要自己特别单独申请
特殊权限,顾名思义,就是一些特别敏感的权限,在android系统中,主要由两个 system_alert_window(设置悬浮窗,进行一些黑科技) write_settings (修改系统设置) 关于上面两个特殊权限的授权,做法是使用startactivityforresult启动授权界面来完成。
申请方式:
private static final int request_code = 1; private void requestalertwindowpermission() { intent intent = new intent(settings.action_manage_overlay_permission); intent.setdata(uri.parse("package:" + getpackagename())); startactivityforresult(intent, request_code); } @override protected void onactivityresult(int requestcode, int resultcode, intent data) { super.onactivityresult(requestcode, resultcode, data); if (requestcode == request_code) {
if (build.version.sdk_int >= build.version_codes.m) {
if (settings.candrawoverlays(this)) {
log.i("xqxinfo", "onactivityresult granted");
}
}
}
}
上一篇: python序列学习