详解Android 8.1.0 Service 中 弹出 Dialog的方法
程序员文章站
2023-11-18 19:31:40
场景:在service 中开启线程下载升级包,当下载完系统升级包,弹出一个dialog 提示用户。
注意,android 系统...
场景:在service 中开启线程下载升级包,当下载完系统升级包,弹出一个dialog 提示用户。
注意,android 系统版本不一样,可能会有不一样的表现。当前是基于 android 8.1.0 的 service 中弹 dialog。
首先,就是要在功能清单列表中声明权限,以下两个都必须声明:
<uses-permission android:name="android.permission.system_alert_window"/><!--这行代码必须存在,否则点击不了系统设置中的按钮--> <uses-permission android:name="android.permission.system_overlay_window" />
然后必须要在mainactivity 进行初始化的时候,再次检查一下当前应用有没有被允许显示在其他应用上层,这一步必不可少。因为当前基于 android 8.1.0,自从android 6.0 以后,google 就对一些敏感权限做了收敛,比如访问sd卡权限,只是在功能清单列表中声明权限是不够的,还要在应用运行期间动态检查是否被授权,需注意当检查出来应用未被授予这些权限,还要提醒用户可能有一些功能无法使用,这个需要注意。
private void checkmypermission() { 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)) { toast.maketext(this, "授权成功", toast.length_short).show(); }else { // system_alert_window permission not granted... toast.maketext(this, "未被授予权限,相关功能不可用", toast.length_short).show(); } } } }
接下来,在 service 中,做如下操作:
//在 service 中创建全局变量 mhandler private handler mhandler; //在 service 生命周期方法 oncreate() 中初始化 mhandler mhandler = new handler(looper.getmainlooper()); //在子线程中想要 toast 的地方添加如下 mhandler.post(new runnable() { @override public void run() { //show dialog justshowdialog(); } }); private void justshowdialog() { alertdialog.builder builder = new alertdialog.builder(getapplicationcontext()) .seticon(android.r.drawable.ic_dialog_info) .settitle("service中弹出dialog了") .setmessage("是否关闭dialog?") .setpositivebutton("确定", new dialoginterface.onclicklistener() { public void onclick(dialoginterface dialog, int whichbutton) { } }) .setnegativebutton("取消", new dialoginterface.onclicklistener() { public void onclick(dialoginterface dialog, int whichbutton) { } }); //下面这行代码放到子线程中会 can't create handler inside thread that has not called looper.prepare() alertdialog dialog = builder.create(); //设置点击其他地方不可取消此 dialog dialog.setcancelable(false); dialog.setcanceledontouchoutside(false); //8.0系统加强后台管理,禁止在其他应用和窗口弹提醒弹窗,如果要弹,必须使用type_application_overlay,否则弹不出 if (build.version.sdk_int >= build.version_codes.o) { dialog.getwindow().settype((windowmanager.layoutparams.type_application_overlay)); }else { dialog.getwindow().settype((windowmanager.layoutparams.type_system_alert)); } dialog.show(); }
这样,在 " android低版本 -> android 6.0 -> android 8.0 -> 更高android版本" 均可以弹出 dialog了。
总结
以上所述是小编给大家介绍的android 8.1.0 service 中 弹出 dialog的方法,希望对大家有所帮助
推荐阅读
-
详解Android 8.1.0 Service 中 弹出 Dialog的方法
-
Android中自定义的dialog中的EditText无法弹出输入法解决方案
-
Android中RecyclerView实现分页滚动的方法详解
-
Android编程中光线传感器的调用方法详解
-
浅析Android Service中实现弹出对话框的坑
-
Android 中Popwindow弹出菜单的两种方法实例
-
Android数据持久化之读写SD卡中内容的方法详解
-
Android之用PopupWindow实现弹出菜单的方法详解
-
android中DatePicker和TimePicker的使用方法详解
-
Android解决dialog弹出时无法捕捉Activity的back事件的方法