工作5年才知道的Android新版本使用Toast的那些坑,已给你总结好

华为、三星等机型禁用通知权限后Toast不弹出

原因

查看Toast源码后发现,Toast显示要通过INotificationManager类来实现,而当通知禁用后,调用此类会返回异常,所以导致通知不显示,源码如下:

public void show() {
  if (mNextView == null) {
    throw new RuntimeException("setView must have been called");
  }

  INotificationManager service = getService();
  String pkg = mContext.getOpPackageName();
  TN tn = mTN;
  tn.mNextView = mNextView;

  try {
    service.enqueueToast(pkg, tn, mDuration);
  } catch (RemoteException e) {
    // 权限禁用后走这里,这里是空方法,所以会发生既不crash又无响应的情况
  }
}

这是一个google的bug,部分小米手机重写了Toast代码,所以可以正常执行,我们可以通过反射的方式来暴力绕过,也就有了如下解决方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio中,`Toast`是一个简单易用的小部件,用于在屏幕上显示短暂的信息或提示。它非常适合用于快速反馈用户的操作结果,比如网络请求成功或失败、数据加载完成等。以下是使用`Toast`的基本步骤: 1. 引入`Toast`库:在需要使用`Toast`的Activity或Fragment中,确保已导入`android.widget.Toast`。 ```java import android.widget.Toast; ``` 2. 创建Toast实例:在需要显示提示的地方,调用`Toast.makeText()`方法,传入要显示的上下文和消息字符串。 ```java String message = "这是一个提示信息"; Toast toast = Toast.makeText(getBaseContext(), message, Toast.LENGTH_SHORT); // 或者使用Context或Activity自身作为上下文 ``` 这里的`getBaseContext()`通常使用`getApplicationContext()`替代,因为它可以在没有Activity的情况下获取全局上下文。 3. 显示 Toast:调用`show()`方法来显示`Toast`。 ```java toast.show(); ``` 4. 控制显示时间:`Toast.LENGTH_SHORT`(默认)表示大约两秒后消失,`Toast.LENGTH_LONG`则更长一些。你可以根据需要选择。 如果你想自定义`Toast`的样式,如动画、图标等,可以通过创建一个新的布局文件并设置相关属性,然后将其设置为`Toast`的内容视图: ```java LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.custom_toast_layout, null); toast.setView(view); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值