• 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);也不用担心安全问题

  • 相关阅读:
    [hibernate]org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter
    [extjs] extjs 5.1 API 开发 文档
    [java] Unsupported major.minor version 51.0 错误解决方案
    [kfaka] Apache Kafka:下一代分布式消息系统
    [spring] org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljav 解决
    [spring] 对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾
    [java] java 中Unsafe类学习
    [java] java 线程join方法详解
    [java] jstack 查看死锁问题
    ORACLE DG之参数详解
  • 原文地址:https://www.cnblogs.com/yinyoupoet/p/13287595.html
Copyright © 2020-2023  润新知