一,背景
这是个沙雕操作,原因是:在小米手机的部分机型上,弹Toast时会在吐司内容前面带上app名称,如下:
此时产品经理发话了:为了统一风格,在小米手机上去掉Toast前的应用名。
网上有以下解决方案,比如:先给toast
的message
设置为空,然后再设置需要提示的message
,如下:
Toast toast = Toast.makeText(context, “”, Toast.LENGTH_LONG);
toast.setText(message);
toast.show();
但这些都不能从根本上解决问题,于是Hook Toast的方案诞生了。
二,分析
首先分析一下Toast的创建过程.
Toast的简单使用如下:
Toast.makeText(this,"abc",Toast.LENGTH_LONG).show();
1,构造toast
通过makeText()
构造一个Toast,具体代码如下:
public static Toast makeText(@NonNull Context context, @Nullable Looper looper,
@NonNull CharSequence text, @Duration int duration) {
if (Compatibility.isChangeEnabled(CHANGE_TEXT_TOASTS_IN_THE_SYSTEM)) {
Toast result = new Toast(context, looper);
result.mText = text;
result.mDuration = duration;
return result;
} else {
Toast result = new Toast(context, looper);
View v = ToastPresenter.getTextToastView(context, text);
result.mNextView = v;
result.mDuration = duration;
return result;