Skip to content

Commit f8ac2da

Browse files
committed
修改 Toast 跨页面显示的实现方式
优化框架获取 Toast 默认延迟时间
1 parent 9a6b553 commit f8ac2da

File tree

5 files changed

+34
-19
lines changed

5 files changed

+34
-19
lines changed

HelpDoc-en.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ public class ToastStrategy {
157157
ToastParams params = new ToastParams();
158158
params.text = "I am a Toast that can be displayed across pages";
159159
// Indicates that this Toast needs to be displayed across pages
160-
params.crossPageShow = true;
160+
params.priorityType = ToastParams.PRIORITY_TYPE_GLOBAL;
161161
Toaster.show(params);
162162

163163
#### Why the framework prefers to use window manager to implement toast

HelpDoc-zh.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ public class ToastStrategy {
173173
ToastParams params = new ToastParams();
174174
params.text = "我是一个能跨页面展示的 Toast";
175175
// 表示这个 Toast 需要跨页面展示
176-
params.crossPageShow = true;
176+
params.priorityType = ToastParams.PRIORITY_TYPE_GLOBAL;
177177
Toaster.show(params);
178178
```
179179

app/src/main/java/com/hjq/toast/demo/MainActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public void showLongToast(View v) {
6060
public void showCrossPageToast(View v) {
6161
ToastParams params = new ToastParams();
6262
params.text = getString(R.string.demo_show_cross_page_toast_result);
63-
params.crossPageShow = true;
63+
params.priorityType = ToastParams.PRIORITY_TYPE_GLOBAL;
6464
Toaster.show(params);
6565
}
6666

library/src/main/java/com/hjq/toast/ToastParams.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@
1212
*/
1313
public class ToastParams {
1414

15+
/** 优先级类型:框架默认选择最优方案来显示,具体实现可以看一下 {@link ToastStrategy#createToast(ToastParams)} */
16+
public static final int PRIORITY_TYPE_DEFAULT = 0;
17+
/** 优先级类型:优先使用全局级 Toast 来显示(显示在所有应用上面,可能需要通知栏权限或者悬浮窗权限) */
18+
public static final int PRIORITY_TYPE_GLOBAL = 1;
19+
/** 优先级类型:优先使用局部的 Toast 来显示(显示在当前 Activity) */
20+
public static final int PRIORITY_TYPE_LOCAL = 2;
21+
1522
/** 显示的文本 */
1623
public CharSequence text;
1724

@@ -26,8 +33,8 @@ public class ToastParams {
2633
/** 延迟显示时间 */
2734
public long delayMillis = 0;
2835

29-
/** 是否跨页面展示(如果为 true 则优先用系统 Toast 实现) */
30-
public boolean crossPageShow;
36+
/** 优先级类型 */
37+
public int priorityType = PRIORITY_TYPE_DEFAULT;
3138

3239
/** Toast 样式 */
3340
public IToastStyle<?> style;

library/src/main/java/com/hjq/toast/ToastStrategy.java

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)