zoukankan      html  css  js  c++  java
  • 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);也不用担心安全问题

  • 相关阅读:
    使用Jenkins进行Android自动打包,自定义版本号等信息【转】
    Android config Android.mk parameter
    cocos2D-X config external library
    OpenCV Install OpenCV with Visual Studio
    cmake make library
    cocos2D-X create image sprite solution
    cocos2d-X 打开一个文件是否跨平台
    android use NDK api call AssetManager
    android add asset file
    android error: cannot use ‘throw’ with exceptions disabled
  • 原文地址:https://www.cnblogs.com/yinyoupoet/p/13287595.html
Copyright © 2011-2022 走看看