Android6.0以后,在BroadcastReceiver中启动AlertDialog导致程序停止运行的问题及解决办法

这里有几个重点,Android 6.0及以后,BroadcastReceiver中启动Dialog,以及程序停止运行的原因,这三点,哪一个出问题了都会直接导致程序的崩溃

先说我自己的问题,我用的sdk版本是目前最新的25,我在获取了显示悬浮窗权限后,程序仍然一运行到AlertDialog.show()的时候就停止运行了,并提示

Unable to start receiver...........You need to use a Theme.AppCompat theme(or descendant) with this activity.....

把activity的主题改成AppCompat后仍然报错,最后在知乎中找到了解决方案,将BroadcastReceiver那个代码中的

import android.Support.v7.app.AlertDialog;

改成

import android.app.AlertDialog;

即可正常运行了。

那么还有什么值得注意的呢?

Android 6.0之后,部分权限仅仅在AndroidManifest中注册已经没用了,但是不在这里注册也不行。出于安全考虑,还需要用户在使用的时候确认并给程序相应的权限。
其余危险权限在此不多赘述,百度多得是,但是有两个特殊的权限,分别是
SYSTEM_ALERT_WINDOW和WRITE_SETTINGS,而这里用到的就是前者:SYSTEM_ALERT_WINDOW

而如何使用它呢?在代码中加入如下代码即可。

private static final int REQUEST_CODE = 1;
    private void requestAlertWindowPermission() {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
        intent.setData(Uri.parse("package:" + getPackageName()));
        startActivityForResult(intent, REQUEST_CODE);
    }
    //回调
    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE) {
            if (Settings.canDrawOverlays(this)) {
                Toast.makeText(this,"弹窗权限开启!",Toast.LENGTH_SHORT).show();


            }else {

            }
        }
    }

同时,在BroadcastReceiver中启动AlertDialog,有不少人说不能这样使用,或者说不建议如此使用。因为广播接收者的生命周期很短,很多人建议使用一个新的activity模拟AlertDialog来使用。但是我认为,既然可以直接使用而且也不复杂的话,那就直接使用,只要设置了dialogBuilder.setCancelable(false);也不用担心安全问题

原文地址:https://www.cnblogs.com/yinyoupoet/p/13287595.html