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


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

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

    需要切换到UI主线程

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

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

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

    private void showToast(final String msg) {
    	runOnUiThread(new Runnable() {
    		@Override
    		public 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() {
    		@Override
    		public void run() {
    			AlertDialog dialog = new AlertDialog.Builder(BaseMsgService.this)
    					.setTitle("提示").setMessage(str).setPositiveButton("确定", new DialogInterface.OnClickListener() {
    				@Override
    				public 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() {
    			@Override
    			public void run() {
    				runOnUiThread(new Runnable() {
    					@Override
    					public void run() {
    						Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
    								Uri.parse("package:" + getPackageName()));
    						startActivityForResult(intent, 111);
    					}
    				});
    			}
    		}).start();
    	}
    }
    

    提问之前,请先看提问须知 点击右侧图标发起提问 联系我 或者加入QQ群一起学习 Stars-One安卓学习交流群 TornadoFx学习交流群:1071184701
  • 相关阅读:
    ORM数据库框架 SQLite ORMLite MD
    ORM数据库框架 greenDAO SQLite MD
    layer-list shape drawable 层叠背景 MD
    BAT 批处理 特殊符号 总结 [MD]
    集合 enum 枚举 简介 案例 [MD].md
    Gradle 翻译 ProGuard Shrink 混淆和压缩 [MD]
    构建配置 Enable multidex
    构建配置 defaultConfig signingConfigs buildTypes productFlavors dependencies
    Android 资源混淆 AndResGuard MD
    Android 第三方加固方案 对比 打包 [MD]
  • 原文地址:https://www.cnblogs.com/stars-one/p/14824006.html
Copyright © 2020-2023  润新知