AI智能
改变未来

谈谈Android中的消息提示那些坑

Android中的消息提示无非就那几种,弹个窗(Toast或SnackBar),或者是弹出个对话框(Dialog),最近在使用的时候也是遇到了问题,有时候导致APP闪退

稍微研究会,总结了一下使用过程中需要注意的几个坑

需要切换到UI主线程

无论是使用弹窗或是弹个对话框,都需要在UI主线程中进行,否则就会导致APP闪退,由于自己经常是直接开个子线程进行网络请求的操作,偶尔会忘记切换回UI线程,就会导致闪退,提醒自己注意一下

自己封装了个弹窗方法作为BaseActivity一个方法中,这样之后新写的Activity页面都是继承这个BaseActivity,需要弹窗,调用方法很方便,连context也可以不用传,十分舒服

需要注意的是,封装记得在外层套个切换主线程的方法,如:

private void showToast(final String msg) {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();}});}

切换UI主线程的方法详情进参考Android开发——实现子线程更新UI – Stars-one – 博客园

后台Service弹窗

首先,得声明一个悬浮窗权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

使用了后台服务,但需要弹个窗,可以使用下面的代码

Handler handler = new Handler(Looper.getMainLooper());handler.post(new Runnable() {@Overridepublic void run() {AlertDialog dialog = new AlertDialog.Builder(BaseMsgService.this).setTitle("提示").setMessage(str).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}}).create();dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);dialog.show();}});

悬浮窗权限

悬浮窗权限这单主要是针对的对话框,由于Android6.0引入了动态权限,如果从开启了一个Service,弹出对话框也会导致APP闪退,错误提示为:

permission denied for window type 2003

如下图所示

可能你的报错提示不是上面这个,但是有

permission denied

这两个字样,估计就是权限的问题

处理的方式很简单,只需要授权即可

//6.0以上需要获取弹窗权限,跳转到设置页面if (Build.VERSION.SDK_INT >= 23) {if (!Settings.canDrawOverlays(Login.this)) {Toast.makeText(Login.this, "软件需要悬浮窗权限,跳转到设置页面请手动勾选允许", Toast.LENGTH_SHORT).show();new Thread(new Runnable() {@Overridepublic void run() {runOnUiThread(new Runnable() {@Overridepublic void run() {Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" + getPackageName()));startActivityForResult(intent, 111);}});}}).start();}}
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 谈谈Android中的消息提示那些坑