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

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

时间:2022-10-31 18:38:43浏览次数:53  
标签:BroadcastReceiver REQUEST AlertDialog Intent 使用 权限 Android6.0


这里有几个重点,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);​​也不用担心安全问题


标签:BroadcastReceiver,REQUEST,AlertDialog,Intent,使用,权限,Android6.0
From: https://blog.51cto.com/u_15854687/5810853

相关文章