Activity在没有完全显示/已退出的情况下显示PopupWindow异常: 问题现象:进入Activity界面直接报错,log异常显示为:"Unable to add window -- token...方法第一个参数为需要依附的view),在Activity没有完全显示时,PopupWindow无法依附在该View上,如果在此时显示PopupWindow会导致上面的异常,同样在退出Activity后也不能正常显示...解决方案:如果在某个地方需要同时执行多个异步任务,强烈建议使用线程池; 数据库升级中的坑: 问题现象:在数据库的某个表中增加/修改了某个字段后,程序在运行时崩溃掉了;或者在增加字段时修改了数据库的版本号...Toast连续显示时长时间不消失: 问题现象:多个Toast同时显示时,Toast一直显示不消失,退出程序了仍然显示; 原因分析:看Toast的源码可以发现,同时显示多个toast时是排队显示的,所以才会出现同时显示多个...建议定义一个全局的Toast对象,这样可以避免连续显示Toast时不能取消上一次Toast消息的情况(如果你有连续弹出Toast的情况,避免使用Toast.makeText); build.gradle
所以从保密需要考虑,app在上线前都得去掉多余的调试信息,也就形成了上线模式。...Toast窗口无交互动作,样式也基本固定,因此除了少数弹窗可予以保留(如“再按一次返回键退出”),其他弹窗都应在发布时屏蔽。...所以Log可以连续打印,但Toast不能连续显示,因为每个弹窗都要停留个几秒,几十上百个弹窗至少得耗时几分钟才会全部显示完毕。...Toast虽然有好些个公开方法,可是常用的也就makeText和show两个方法,实际开发中一般都是下面一行代码就完事了。 Toast.makeText(this, "再按一次返回键退出!"...下面是异常消息提示对话框的代码例子: import android.annotation.SuppressLint; import android.app.AlertDialog; import android.content.Context
如果在加载的时候,进行旋转,则会发生错误,异常退出(退出原因:dialog.dismiss()时发生NullPointException,因为与当前对话框绑定的FragmentManager为null,...在运行时配置发生变化时,在Fragment中保存有状态的对象 a) 继承Fragment,声明引用指向你的有状态的对象 b) 当Fragment创建时调用setRetainInstance(boolean...; import android.widget.Toast; /** * @author zhy * */ public class ConfigChangesTestActivity extends...效果图: 6、旋转屏幕的最佳实践 下面要开始今天的难点了,就是处理文章开始时所说的,当异步任务在执行时,进行旋转,如果解决上面的问题。...= activity) { activity.onTaskCompleted(); } } } 异步任务中,管理一个对话框,当开始下载前,进度框显示,下载结束进度框消失,并为Activity
这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。...怎样确定那些程序可以运行,那些要被销毁,Android让每一个进程在一个重要级的基础上运行,重要级低的进程最有可能被淘汰,一共有5级,下面这个列表就是按照重要性排列的: 1 一个前台进程显示的是用户此时需要处理和显示的...3 一个服务进程是一个通过调用startService()方法启动的服务,并且不属于前两种情况。尽管服务进程没有直接被用户看到,但他们确实是用户所关心的,比如后台播放音乐或网络下载数据。...所以系统保证他们的运行,直到不能保证所有的前台可见程序都正常运行时才会终止他们。...通常,后台进程会有很多个在运行,所以他们维护一个LRU最近使用程序列表来保证经常运行的activity能最后一个被终止。
这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。 ...怎样确定那些程序可以运行,那些要被销毁,Android让每一个进程在一个重要级的基础上运行,重要级低的进程最有可能被淘汰,一共有5级,下面这个列表就是按照重要性排列的: 1 一个前台进程显示的是用户此时需要处理和显示的...3 一个服务进程是一个通过调用startService()方法启动的服务,并且不属于前两种情况。尽管服务进程没有直接被用户看到,但他们确实是用户所关心的,比如后台播放音乐或网络下载数据。...所以系统保证他们的运行,直到不能保证所有的前台可见程序都正常运行时才会终止他们。...通常,后台进程会有很多个在运行,所以他们维护一个LRU最近使用程序列表来保证经常运行的activity能最后一个被终止。
当要显示一个Toast的时候,NotificationManagerService会产生一个token用于校验。...=TYPE_TOAST的类型的toast不能重复添加,所以这样也会报一个BadTokenException,接下来我们就要通过这个demo,用hook的解决方案来解决这个异常。...阅读源码我们发现,在Android 7.0 Toast.java上: 和在Android 8.0 Toast.java上: 对比我们发现在Android 8.0中,在WindowManager...那么我们就可以参考8.0的方法,直接catch住这个异常。...一旦检测到执行成员函数finalize时超出一定时间,那么就会退出VM,抛出TimeoutException。
这意味着,如果一项活动进入 resumed 状态,则另一项 activity 可能会退出 resumed 状态。...app 日志: 退出 设备配置与 Activity 生命周期 旋转设备会改变设备配置(device configuration)。...在运行时配置变更(runtime configuration change)发生时,可能会有更合适的资源来匹配新的设备配置。...mQuestionsAnswered = savedInstanceState.getBooleanArray(KEY_QUESTION_ANSWERED) } 挑战练习:评分 (用户答完全部题后,显示一个...} else { R.string.incorrect_toast } Toast.makeText(this, messageResId
Exception Java的异常分两类,运行时异常RuntimeException和非运行时异常。...等等,(网上很多文章把SQLException归为非运行时异常,但查看源码SQLException继承自RuntimeException,所以它应是运行时异常)。...非运行时异常包括输入输出异常IOException、无此加密算法异常NoSuchAlgorithmException等等。 非运行时异常在编码的时候就要进行处理,不然编译都通不过。...; import android.widget.Toast; public class CrashHandler implements UncaughtExceptionHandler {...(mContext, "程序出错,即将退出:\n"+msg, Toast.LENGTH_LONG).show(); Looper.loop();
前言: 项目APP有时候会出现Crash,然后就是弹出系统强制退出的对话框,点击关闭APP。 ...有的APP进行了处理,会发现,当程序出现异常的时候,会Toast一个提示“程序出现异常,3秒后将退出程序”。3秒后即关闭程序而不再显示强制关闭的对话框。 ...(context,"程序出现异常,2秒后退出",Toast.LENGTH_SHORT).show(); Looper.loop(); }..." android:supportsRtl="true" android:name=".MApplication" android:theme="@style...所以总会有没有捕获到的异常出现。 进行对未捕获异常的处理,可以提高一个用户体验。 开发者们 也可以 在这个处理中添加异常分析,将出现的异常设备、原因、时间等信息提交到自己的服务器上方便以后分析。
Toast在Android 7.1.2(API25)以下会发生BadTokenException异常,导致App崩溃。...自定义TYPE_TOAST类型的Window,在Android 7.1.1、7.1.2发生token null is not valid异常,导致App崩溃。...调用service.enqueueToast(pkg, tn, mDuration)将当前Toast的显示加入到通知队列,并传递了一个tn对象,这个对象就是NMS用作回传Toast的显示状态。...首先想到就是对Toast加上try-catch,但是发现不起作用,原因是这个异常并非在当前线程中立即被抛出的,而是添加到了消息队列中,等待消息真正执行时才会被抛出。...Google在Android 8.0的代码提交中修复了这个问题,把8.0的源码和前一版本对比可以发现,如同我们的分析,Google在消息执行处将异常catch住了。
如果您的布局在窗口的每个垂直边缘配置多个抽屉视图,则会在运行时抛出异常。...> parent, View view, int position, long id) { Toast.makeText(MainActivity.this, "点击"+...position , Toast.LENGTH_SHORT).show(); } }); } //返回键监听 @Override...{ if ((System.currentTimeMillis() - DOUBLE_CLICK_TIME) > 2000) { Toast.makeText...(MainActivity.this, "再按一次退出", Toast.LENGTH_SHORT).show(); DOUBLE_CLICK_TIME = System.currentTimeMillis
每个Activity的状态是由它在Activity栈(是一个后进先出LIFO,包含所有正在运行Activity的队列)中的位置决定的。 ...运行时可以发现第一次startService时,会调用onCreate和onStart,在没有stopService前,无论点击多少次startService,都只会调用onStart。...而且动态注册,需要特别注意的是,在退出程序前要记得调用Context.unregisterReceiver()方法。...} } } 复制代码 在运行时,发现除了响铃时可以获取来电号码,接听和挂断都不能成功获取的,显示为null。...android中对数据操作包含有: file, sqlite3, Preferences, ContectResolver与ContentProvider前三种数据操作方式都只是针对本应用内数据
异常和偶尔不显示的问题 当你在程序中调用了 Toast 的 API,你可能会在后台看到类似这样的 Toast 执行异常: android.view.WindowManager$BadTokenException...android.widget.Toast$TN.handleShow(Toast.java:459) 另外,在某些系统上,你没有看到什么异常,却会出现 Toast 无法正常展示的问题。...为了解释上面这些问题产生的原因,我们需要先读一遍 Toast 的源码。 2. Toast 的显示和隐藏 首先,所有 Android 进程的视图显示都需要依赖于一个窗口。...异常产生的原因 上面我们分析了 Toast 的显示和隐藏的源码流程,那么为什么会出现显示异常呢?我们先来看下这个异常是什么呢?...当进程异常退出后我们截取他们的日志可以得到: 12-28 11:10:30.086 24599 24599 E AndroidRuntime: android.view.WindowManager$BadTokenException
SnackBar是 Android Support Library 22.2.1 里面新增提供的一个控件,我们可以简单的把它理解成一个加强版的Toast,或者是一个轻量级的Dialog。...特点: 1.SnackBar和Toast的用途一样,都是用来提示用户操作后的结果的。 2.SnackBar显示时位置一般是在屏幕底部,较大的设备就显示在左下角。...Toast那样 退出Activity了,Toast还继续显示的问题) 6.SncakBar能支持侧滑 看一下SnackBar的使用方法: 三个参数:View ,内容文本,显示时长 public...的使用类似 Toast的三个参数:上下文,内容文本,显示时长 Toast.makeText(this,"Toast内容",Toast.LENGTH_SHORT).show(); 可以看出,SnackBar...",Snackbar.LENGTH_SHORT).show(); } }); } } 显示前: ?
因此,再显示Toast信息提示框的同时,屏幕上的控件仍然可以继续操作。 Toast的基本用法 显示Toast需要使用android.widget.Toast类。...只显示文本的Toast 如果只是显示文本的话,可以用如下代码 Toast toast = Toast.makeText(this,"文字",Toast.LENGTH_LONG); toast.show(...该方法的第二个参数是要显示的信息, 第三个参数标识Toast提示信息显示的时间。...一下代码会抛出异常 Toast toast = new Toast(); toast.setText("文字");// 此行代码会抛出异常 toast.show(); 显示文本和图像的Toast- setView...> 如果同时多个Toast信息提示框,系统会将这些Toast信息提示框放到队列中,等前一个Toast信息提示框关闭后会显示下一个Toast信息提示框,也就是说Toast信息提示框是按顺序显示的 ----
该漏洞的解决方案: 1.将allowBackup 的值设置为false;(allowBackup的值为false 对项目运行没有任何影响) 2.通过手机设备的IMEI号来辨识来设备编号和备份前是否一致,...(), "没有该子APP,请下载安装", * Toast.LENGTH_LONG).show(); } */ Intent intent = new...; } } 不显示桌面图标的子apks 其中要想不显示桌面图标只需修改AndroidManifest.xml文件即可。...)会自动检测系统已经安装的应用软件的包名,然后把这些APP的图标和名称解析出来后显示在应用程序列表里,一旦我们像上面那样设置不显示APK图标,则APK程序在运行后只会显示在“正在运行”的程序列表中,而不会在桌面上显示图标和名字...本包名应当在Android系统运行时唯一。
首先捕获程序崩溃的异常就必须了解一下java中UncaughtExceptionHandler这个接口,android沿用了此接口,在android API中: ?...在实现UncaughtExceptionHandler时,必须重载uncaughtException(Thread thread, Throwable ex) ,如果我们没有实现该接口 也就是没有显示捕捉异常...来显示异常信息 new Thread(){ @Override public void run() { Looper.prepare...(); Toast.makeText(application.getApplicationContext(), "很抱歉,程序出现异常,即将退出...如何杀死异常进程,重启应用,就得使用PendingIntent,这个类是android中对Intent类的包装,具体了解我会在写一篇博客,自己也可以去查看android API。
概述 Service是Android四大组件之一,主要两个目的: 后台运行和跨进程访问。 通过启动一个Service,可以在不显示界面的前提下在后台运行指定的任务,这样可以不影响用户做其他事情。...import android.os.IBinder; import android.view.View; import android.widget.Button; import android.widget.Toast...getRunningServices(int maxNum) maxNum表示返回正在运行的服务的最大数,如果正在运行的服务小于maxNum,则按照实际数量返回,一般可以将该参数的值设置为一个较大的值...(ServiceDemoAct.this, "服务正在运行...服务的名字,如果此项不设置,那么默认显示的服务名则为类名 android:icon -------------- 服务的图标 android:permission ------- 申明此服务的权限