欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-06-29 18:31:51
场景:在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的方法,希望对大家有所帮助