详解Android 8.1.0 Service 中 弹出 Dialog的方法
时间:2022-07-27
本文章向大家介绍详解Android 8.1.0 Service 中 弹出 Dialog的方法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
场景:在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的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对ZaLou.Cn网站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
- Node.js中的内存泄漏分析
- Java实现把整数转换为英语单词的方法,实用代码
- Chrome XSS审计之SVG标签绕过
- Java实现的一个简单计算器,有字符分析功能
- Java中实现判断括号是否有效的方法,实用代码
- Java中使用栈实现一个队列,实用代码
- NDK 的开发流程
- 蜜罐背后的影子系统探秘
- Oracle 免费的数据库--Database 快捷版 11g 安装使用与SOD框架对Oracle的CodeFirst支持
- 如何求最小三元组距离
- 如何将Pastebin上的信息应用于安全分析和威胁情报领域
- Optionsbleed 漏洞泄露 Apache Server 的内存信息
- 对两个有序数组进行合并
- No.016 3Sum Closest
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 绕安全狗的那些事
- single-spa 基础概念
- DVWA-对Command Injection(命令注入)的简单演示与分析
- 如何探测内网存活主机
- Java ServletContext详解
- Java web Cookie详解(持久化+原理详解+共享问题+设置中文+发送多个Cookie)
- 实战记录之SQL server报错手工注入
- 树莓派基础实验23:触摸开关传感器实验
- springmvc 文件下载 VS resteasy 文件上传下载
- Struts Scan工具的使用
- 树莓派基础实验24:超声波测距传感器实验
- 数据结构与算法系列2 线性表 链表的分类+使用java实现链表+链表源码详解
- 从spring boot 启动过程看apollo的初始化过程( 二)
- Apache IoTDB 系列教程-4:客户端接口
- 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解