Android8.1.0Service中如何弹出Dialog-创新互联

这篇文章主要为大家展示了“Android8.1.0Service中如何弹出Dialog”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android8.1.0Service中如何弹出Dialog”这篇文章吧。

创新互联2013年至今,先为绵阳等服务建站,绵阳等地企业,进行企业商务咨询服务。为绵阳企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

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

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

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

 

然后必须要在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了。

以上是“Android8.1.0Service中如何弹出Dialog”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!


网页题目:Android8.1.0Service中如何弹出Dialog-创新互联
路径分享:http://scyanting.com/article/hjgie.html