服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - 详解Android 8.1.0 Service 中 弹出 Dialog的方法

详解Android 8.1.0 Service 中 弹出 Dialog的方法

2022-11-03 15:32Water_Marking Android

这篇文章主要介绍了Android 8.1.0 Service 中怎么弹出 Dialog问题,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

场景:在Service 中开启线程下载升级包,当下载完系统升级包,弹出一个Dialog 提示用户。

        注意,Android 系统版本不一样,可能会有不一样的表现。当前是基于 Android 8.1.0 的 Service 中弹 Dialog。

        首先,就是要在功能清单列表中声明权限,以下两个都必须声明:

?
1
2
<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卡权限,只是在功能清单列表中声明权限是不够的,还要在应用运行期间动态检查是否被授权,需注意当检查出来应用未被授予这些权限,还要提醒用户可能有一些功能无法使用,这个需要注意。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 中,做如下操作:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//在 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的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

原文链接:https://blog.csdn.net/Water_Marking/article/details/102570579

延伸 · 阅读

精彩推荐