Android Toast 源码分析

本文分析了Android Toast的源码实现,揭示了其并非View类,而是通过一个静态内部类TN来实现弹窗功能。TN继承自IWindowSession,利用IPC通信与INotificationManager交互,实现show、hide和cancel等操作。Toast的构造函数创建TN实例,show方法通过应用端与服务端的消息传递构建UI。
摘要由CSDN通过智能技术生成

转载请注明出处:王亟亟的大牛之路

这两天 在看一些Window的实现,顺便扫到了Toast,这一篇做一些Toast实现原理的分析
日常安利:https://github.com/ddwhan0123/Useful-Open-Source-Android


Toast位于package android.widget目录下,跟各类系统提供的控件在一起
在没看源码之前以为他是一个Viewpublic class Toast {},结果看只是一个普通的class,甚至连继承都没有,带着疑问我们看下是如何实现,弹窗功能的


构造函数
我们平时其实几乎不会new Toast来做一些操作,但是为了介绍TN对象是什么,所以还是来介绍下

public Toast(Context context) {
   
        this(context, null);
    }

    public Toast(@NonNull Context context, @Nullable Looper looper) {
   
        mContext = context;
        //创建了一个TN对象
        mTN = new TN(context.getPackageName(), looper);
       //初始化位置    
        mTN.mY = context.getResources().getDimensionPixelSize(
                com.android.internal.R.dimen.toast_y_offset);   
        mTN.mGravity = context.getResources().getInteger(
                com.android.internal.R.integer.config_toastDefaultGravity);
    }

最常用的方法makeText

这方法最重要的是给Toast的mNextView对象进行了初始化,在后面的TN对象中也一直会使用这个View对象

 public static Toast makeText(@NonNull Context context, @Nullable Looper looper,
            @NonNull CharSequence text, @Duration int duration) {
   
        Toast result = new Toast(context, looper);
		//构建简单的视图
        LayoutInflater inflate = (LayoutInflater)
                context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
        TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
        tv.setText(text);

        result.mNextView = v;
        result.mDuration = duration;

        return result;
    }

TN
TN是Toast类的一个静态内部类,是我们具体实现复层弹窗效果的类,他继承于ITransientNotification.Stub,也就是说他是一个实用AIDL的方式实现IPC的操作


                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值