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