@@ -97,11 +97,15 @@ public int computeShowDuration(CharSequence text) {
9797 public IToast createToast (ToastParams params ) {
9898 Activity foregroundActivity = getForegroundActivity ();
9999 IToast toast ;
100- if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M &&
100+ if ((params .priorityType == ToastParams .PRIORITY_TYPE_DEFAULT ||
101+ params .priorityType == ToastParams .PRIORITY_TYPE_GLOBAL ) &&
102+ Build .VERSION .SDK_INT >= Build .VERSION_CODES .M &&
101103 Settings .canDrawOverlays (mApplication )) {
102104 // 如果有悬浮窗权限,就开启全局的 Toast
103105 toast = new GlobalToast (mApplication );
104- } else if (!params .crossPageShow && isActivityAvailable (foregroundActivity )) {
106+ } else if ((params .priorityType == ToastParams .PRIORITY_TYPE_DEFAULT ||
107+ params .priorityType == ToastParams .PRIORITY_TYPE_LOCAL ) &&
108+ isActivityAvailable (foregroundActivity )) {
105109 // 如果没有悬浮窗权限,就开启一个依附于 Activity 的 Toast
106110 toast = new ActivityToast (foregroundActivity );
107111 } else if (Build .VERSION .SDK_INT == Build .VERSION_CODES .N_MR1 ) {
@@ -131,13 +135,13 @@ public void showToast(ToastParams params) {
131135 case SHOW_STRATEGY_TYPE_IMMEDIATELY : {
132136 // 移除之前未显示的 Toast 消息
133137 cancelToast ();
134- long uptimeMillis = SystemClock .uptimeMillis () + params .delayMillis + (params . crossPageShow ? 0 : getDefaultDelayTime () );
138+ long uptimeMillis = SystemClock .uptimeMillis () + params .delayMillis + generateShowDelayTime (params );
135139 HANDLER .postAtTime (new ShowToastRunnable (params ), mShowMessageToken , uptimeMillis );
136140 break ;
137141 }
138142 case SHOW_STRATEGY_TYPE_QUEUE : {
139143 // 计算出这个 Toast 显示时间
140- long showToastMillis = SystemClock .uptimeMillis () + params .delayMillis + (params . crossPageShow ? 0 : getDefaultDelayTime () );
144+ long showToastMillis = SystemClock .uptimeMillis () + params .delayMillis + generateShowDelayTime (params );
141145 // 根据吐司的长短计算出等待时间
142146 long waitMillis = generateToastWaitMillis (params );
143147 // 如果当前显示的时间在上一个 Toast 的显示范围之内
@@ -160,6 +164,20 @@ public void cancelToast() {
160164 HANDLER .postAtTime (new CancelToastRunnable (), mCancelMessageToken , uptimeMillis );
161165 }
162166
167+ /**
168+ * 生成默认延迟时间
169+ */
170+ protected int generateShowDelayTime (ToastParams params ) {
171+ // 延迟一段时间之后再执行,因为在没有通知栏权限的情况下,Toast 只能显示在当前 Activity 上面(即使用 ActivityToast)
172+ // 如果当前 Activity 在 showToast 之后立马进行 finish 了,那么这个时候 Toast 可能会显示不出来
173+ // 因为 Toast 会显示在销毁 Activity 界面上,而不会显示在新跳转的 Activity 上面,所以会导致显示不出来的问题
174+ // 另外有悬浮窗权限的情况下,使用全局的 Toast(即使用 GlobalToast),这种立刻显示也会有一些问题
175+ // 我在小米 12 Android 12 的手机上面测试,从权限设置页返回的时候,发现 Toast 有几率会从左上的位置显示,然后会变回正常的位置
176+ // 如果是系统的 Toast(即使用 SystemToast、SafeToast、NotificationToast 任意一个)则不会有这个问题
177+ // 300 只是一个经验值,经过很多次验证得出来的值,当然你觉得这个值不是自己想要的,也可以重写此方法改成自己想要的
178+ return 300 ;
179+ }
180+
163181 /**
164182 * 是否支持设置自定义 Toast 样式
165183 */
@@ -192,16 +210,6 @@ protected int generateToastWaitMillis(ToastParams params) {
192210 return 0 ;
193211 }
194212
195- /**
196- * 获取默认延迟时间
197- */
198- protected int getDefaultDelayTime () {
199- // 延迟一段时间之后再执行,因为在没有通知栏权限的情况下,Toast 只能显示在当前 Activity 上面
200- // 如果当前 Activity 在 showToast 之后立马进行 finish 了,那么这个时候 Toast 可能会显示不出来
201- // 因为 Toast 会显示在销毁 Activity 界面上,而不会显示在新跳转的 Activity 上面
202- return 200 ;
203- }
204-
205213 /**
206214 * 显示任务
207215 */
0 commit comments