android 在广播中弹出Dialog无效、失败解决(究极无敌完美实现版本)

代码经过博主亲测,可以实现在BroadcastReceiver中弹出dialog的需求。

废话不多说,直接上码。

1.悬浮窗权限申请

AndroidManifest中加入:

    

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

代码中加入:

/**
     * 监测悬浮窗权限
     */
    @TargetApi(23)
    private void requestSettingCanDrawOverlays() {
        if (!Settings.canDrawOverlays(mContext)) {
            permissionDialog = DialogUtil.showHintDialogForCommonVersion(mContext, "某些重要通知的展示需要悬浮窗权限,请开启悬浮窗权限,以免错过重要通知~",
                    "去开启", "下次再说", new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            switch (v.getId()) {
                                case R.id.tv_positive:
                                    int sdkInt = Build.VERSION.SDK_INT;
                                    if (sdkInt >= Build.VERSION_CODES.O) {//8.0以上
                                        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
                                        startActivityForResult(intent, REQUEST_DIALOG_PERMISSION);
                                    } else if (sdkInt >= Build.VERSION_CODES.M) {//6.0-8.0
                                        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
                                        LogUtil.d(TAG + " packageName = " + mContext.getPackageName());
                                        intent.setData(Uri.parse("package:" + mContext.getPackageName()));
                                        startActivityForResult(intent, REQUEST_DIALOG_PERMISSION);
                                    }
                                    permissionDialog.dismiss();
                                    break;
                                case R.id.tv_negative:
                                    permissionDialog.dismiss();
                                    break;
                            }
                        }
                    });
        }
    }

在适当位置调用此方法进行权限申请,DialogUtil是博主自己的一个弹窗工具类,弹窗样式请自定义,或者在文末的链接处下载。

2.BroadcastReceiver弹出Dialog

在需要的位置调用弹出dialog代码:

passDialog = DialogUtil.showHintDialogForBroadcastReceiver(mContext,
                                "审核通过,快召唤好友投票获取最终大奖吧~", "去查看", "稍后", new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        switch (v.getId()){
                                            case R.id.tv_positive:
                                                Session.getSession().put(Constant.INTENT_EVENT,Constant.ACTIVITIES_FRAGMENT);
                                                Intent intent = new Intent(mContext,HomePageActivity.class);
                                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                                mContext.startActivity(intent);
                                                passDialog.dismiss();
                                                break;
                                            case R.id.tv_negative:
                                                passDialog.dismiss();
                                                break;
                                        }
                                    }
                                });

封装的dialog代码:(重点)

public static Dialog showHintDialogForBroadcastReceiver(Context context, String msg, String positiveBtnText,
                                                            String negativeBtnText, View.OnClickListener onClickListener) {
        Dialog dialog = new Dialog(context);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.hint_dialog_for_common_version);
        TextView tv_hint_content = dialog.findViewById(R.id.tv_hint_content);
        tv_hint_content.setText(msg);
        TextView tv_positive = dialog.findViewById(R.id.tv_positive);
        tv_positive.setText(positiveBtnText);
        TextView tv_negative = dialog.findViewById(R.id.tv_negative);
        tv_negative.setText(negativeBtnText);
        tv_positive.setOnClickListener(onClickListener);
        tv_negative.setOnClickListener(onClickListener);
        Window window = dialog.getWindow();
        if (window != null) {
            WindowManager.LayoutParams layoutParams = window.getAttributes();
            layoutParams.width = ScreenUtils.getScreenWidth() - SizeUtils.dp2px(30);
            window.setAttributes(layoutParams);
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
                window.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
            }else{
                window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            }
        }
        dialog.setCanceledOnTouchOutside(true);
        dialog.show();
        return dialog;
    }

博主项目亲测可以正常弹出dialog,如果遇到问题可以在下方留言。

DialogUtil下载链接:https://download.csdn.net/download/yonghuming_jesse/11645754

另,附上博主自己的淘宝客项目下载码(可查淘宝商品优惠券,使用优惠券购物后可加微信客服返现,返现额度全网最高,客服微信android_jesse):

发布了73 篇原创文章 · 获赞 30 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/yonghuming_jesse/article/details/100170161