CN106383712A - 一种Toast组件实现方法和系统 - Google Patents

一种Toast组件实现方法和系统 Download PDF

Info

Publication number
CN106383712A
CN106383712A CN201610837712.8A CN201610837712A CN106383712A CN 106383712 A CN106383712 A CN 106383712A CN 201610837712 A CN201610837712 A CN 201610837712A CN 106383712 A CN106383712 A CN 106383712A
Authority
CN
China
Prior art keywords
toast
layout
assembly
windowmanager
root
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201610837712.8A
Other languages
English (en)
Other versions
CN106383712B (zh
Inventor
刘琛
刘一琛
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Wuhan Douyu Network Technology Co Ltd
Original Assignee
Wuhan Douyu Network Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Wuhan Douyu Network Technology Co Ltd filed Critical Wuhan Douyu Network Technology Co Ltd
Priority to CN201610837712.8A priority Critical patent/CN106383712B/zh
Publication of CN106383712A publication Critical patent/CN106383712A/zh
Application granted granted Critical
Publication of CN106383712B publication Critical patent/CN106383712B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/20Software design
    • G06F8/24Object-oriented

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Digital Computer Display Output (AREA)
  • User Interface Of Digital Computer (AREA)

Abstract

本发明实施例提供了一种Toast组件实现方法和系统,用于解决现有技术在实现Toast组件时,存在依赖acitvity和授权的技术问题。所述方法包括:获得Toast布局;创建Toast根布局;通过所述Toast根布局的addView函数将所述Toast布局添加到Toast根布局中;通过WindowManager的addView函数将所述Toast根布局添加到所述WindowManager的对象中;其中,所述WindowManager的addView函数中用于表示显示视图参数的WindowManager.LayoutParams的等级与原生Toast相同;通过持有主线程消息队列的Handler对象将所述Toast根布局发送到所述主线程消息队列中,进而显示所述Toast根布局对应的Toast组件。本发明实现了克服原生Toast多个缺点的同上,避免依赖acitvity和授权的技术问题。

Description

一种Toast组件实现方法和系统
技术领域
本发明涉及计算机技术领域,尤其涉及一种Toast组件实现方法和系统。
背景技术
Toast组件是Android系统中用来在界面显示提示消息的组件。原始Toast,或原生Toast存在如下缺点:1)显示时间无法自定义:Toast组件只有LENGTH_SHORT(TOAST组件内部的宏定义)定义的4秒显示时间或者LENGTH_LONG(TOAST组件内部的宏定义)定义的5秒显示时间,无法设置其它显示时间,进而在Toast显示内容过多时,用户可能无法浏览完全部内容;2)当有多个Toast显示时,会叠加显示:当有多个Toast组件在显示时,会叠加在一起,造成视图重叠,叠加显示不仅降低视图渲染效率,浪费系统资源,且严重时使用户感觉明显的丢帧卡顿;3)关闭Toast效率低:想要关闭一个Toast组件,必须将其单独通过一个变量保存起来进行取消,但是当应用退出而关闭多个Toast组件时,对每个显示的Toast都用变量保存是很难实现的;4)Toast只支持显示文本,不支持显示图片:原生Toast组件提供的接口只能显示文字,想要显示图片必须单独自定义一个布局的view传入,替换本身的Toast布局才可以,操作复杂;5)无法设置显示消失的动画:Toast组件的显示消失动画依赖于其内部window的显示消失动画定义,而Toast组件没有提供内部window的设置获取接口,因此无法对Toast组件自定义设置显示消失动画;6)无法直接在普通线程中显示:Toast组件内部有一个维护消息的handler,但是该handler所控制的线程是不具有消息队列的Toast调用线程,所以Toast组件直接在不具有消息队列的普通线程中直接进行显示,会导致应用出现异常。
现有技术中有两种相关技术如下解决上述一个或多个问题:
1、通过Dialog实现Toast:通过Android提供的Dialog组件去模拟实现Toast组件能很好的解决显示时长,图片显示,显示消失动画设置等问题。然而,由于Android的Dialog显示必须依赖于活动上下文activity context,当Dialog在显示时,如果activity结束,会使Dialog也会消失,并造成窗体内存泄漏。同时,在实际开发中,往往有跨acitvity显示Toast的需求,所以第1种方式并不能很好的显示Toast。另外,由于Dialog只支持Activity级的context,所以在service也无法显示。
2、基于system alert类型的窗口window实现Toast:Android的窗体window有很多不同的级别,system alert类型的窗体能够在任何级别的context下进行显示,但是使用system alert类型的window必须为其申请SYSTEM_ALERT_WINDOW权限。为Taost这种简单的功能额外增加权限声明并不友好。并且在一些第三方rom(即,定制的Android系统)中,默认将SYSTEM_ALERT_WINDOW权限关闭,因此,要显示system alert类型的window需要用户手动对应用开启权限,以此造成的后果就是可能部分厂商的设备无法直接显示,而且让用户单独去开启一个权限也大大降低了用户体验。所以第2种方式会使得用户必须手动为不同应用启动权限,或者使得一些应用的Toast无法正常显示。
所以,现有技术在实现Toast组件时,存在依赖acitvity和授权的技术问题。
发明内容
本发明实施例提供了一种Toast组件实现方法和系统,用于解决现有技术在实现Toast组件时,存在依赖acitvity和授权的技术问题。
第一方面,本发明提供了一种Toast组件实现方法,包括:
获得Toast布局;
创建Toast根布局;
通过所述Toast根布局的addView函数将所述Toast布局添加到Toast根布局中;
通过WindowManager的addView函数将所述Toast根布局添加到所述WindowManager的对象中;其中,所述WindowManager的addView函数中用于表示显示视图参数的WindowManager.LayoutParams的等级与原生Toast相同;
通过持有主线程消息队列的Handler对象将所述Toast根布局发送到所述主线程消息队列中,进而显示所述Toast根布局对应的Toast组件。
可选的,获得Toast布局,包括:
创建默认Toast布局,或者通过自定义布局传入接口接收自定义Toast布局;其中,所述默认Toast布局至少包括用于显示图片的子控件。
可选的,在通过WindowManager的addView函数将所述Toast根布局添加到所述WindowManager的对象中之前,还包括:
将所述WindowManager.LayoutParams的Flags参数置为不可点击状态。
可选的,在通过持有主线程消息队列的Handler对象将所述Toast根布局发送到所述主线程消息队列中之后,还包括:
通过所述Handler对象的postDelayed函数将所述Toast根布局和延迟时间发送到所述主线程消息队列中,进而在显示所述Toast组件所述延迟时间后移除所述Toast组件。
可选的,所述方法还包括:
基于懒加载加载单例模式;
显示所述Toast根布局对应的Toast组件,包括:
判断WindowManager是否存在Toast组件的单例;
当存在所述Toast组件的单例时,以当前从所述主线程消息队列中读取到的所述Toast组件刷新已存在的所述Toast组件的单例;
当不存在所述Toast组件的单例时,创建所述Toast组件的单例,并显示当前从所述主线程消息队列中读取到的所述Toast组件。
第二方面,本发明提供了一种Toast组件实现系统,包括:
布局获得模块,用于获得Toast布局;
根布局创建模块,用于创建Toast根布局;
第一添加模块,用于通过所述Toast根布局的addView函数将所述Toast布局添加到Toast根布局中;
第二添加模块,用于通过WindowManager的addView函数将所述Toast根布局添加到所述WindowManager的对象中;其中,所述WindowManager的addView函数中用于表示显示视图参数的WindowManager.LayoutParams的等级与原生Toast相同;
消息发送模块,用于通过持有主线程消息队列的Handler对象将所述Toast根布局发送到所述主线程消息队列中,进而显示所述Toast根布局对应的Toast组件。
可选的,所述布局获得模块用于创建默认Toast布局,或者通过自定义布局传入接口接收自定义Toast布局;其中,所述默认Toast布局至少包括用于显示图片的子控件。
可选的,所述系统还包括:
设置模块,用于在通过WindowManager的addView函数将所述Toast根布局添加到所述WindowManager的对象中之前,将所述WindowManager.LayoutParams的Flags参数置为不可点击状态。
可选的,所述消息发送模块还用于在通过持有主线程消息队列的Handler对象将所述Toast根布局发送到所述主线程消息队列中之后,通过所述Handler对象的postDelayed函数将所述Toast根布局和延迟时间发送到所述主线程消息队列中,进而在显示所述Toast组件所述延迟时间后移除所述Toast组件。
可选的,所述系统还包括:
加载模块,用于基于懒加载加载单例模式;
显示模块,用于判断WindowManager是否存在Toast组件的单例;当存在所述Toast组件的单例时,以当前从所述主线程消息队列中读取到的所述Toast组件刷新已存在的所述Toast组件的单例;当不存在所述Toast组件的单例时,创建所述Toast组件的单例,并显示当前从所述主线程消息队列中读取到的所述Toast组件
本申请实施例中的上述一个或多个技术方案,至少具有如下一种或多种技术效果:
在本发明实施例的技术方案中,首先获得Toast布局并创建根布局,接着,再通过WindowManager的addView函数将Toast根布局添加到WindowManager的对象中,最终持有主线程消息队列的handler对象将Toast根布局发送到主线程消息队列中,进而主线程处理到Toast根布局消息时,就能够显示对应的Toast组件。其中,WindowManager的addView函数中用于表示显示视图参数的WindowManager.LayoutParams的等级与原生Toast相同。可见,一方面,由于本发明实施例的Toast组件由Toast布局实现,而不是利用其它对象模拟,所以Toast的显示就不会依赖于acitvity,那么跨acitvity的操作也就不会导致Toast显示异常;另一方面,由于原生Toast的显示并不需要具备权限,而本发明实施例中的WindowManager的addView函数中用于表示显示视图参数的WindowManager.LayoutParams的被设置为原生Toast相同的等级,那么,显示本发明的Toast组件时自然也不需要申请权限,所以避免了Toast组件由于没有获得权限而显示异常。
附图说明
图1为本发明实施例中Toast组件实现方法的流程图;
图2为本发明实施例中Toast组件实现的逻辑流程图;
图3为本发明实施例中实现Toast组件实现的系统架构示意图。
具体实施方式
本发明实施例提供了一种Toast组件实现方法和系统,用于解决现有技术在实现Toast组件时,存在依赖acitvity和授权的技术问题。
为了解决上述技术问题,本发明提供的技术方案总体思路如下:
在本发明实施例的技术方案中,首先获得Toast布局并创建根布局,接着,再通过WindowManager的addView函数将Toast根布局添加到WindowManager的对象中,最终持有主线程消息队列的handler对象将Toast根布局发送到主线程消息队列中,进而主线程处理到Toast根布局消息时,就能够显示对应的Toast组件。其中,WindowManager的addView函数中用于表示显示视图参数的WindowManager.LayoutParams的等级与原生Toast相同。可见,一方面,由于本发明实施例的Toast组件由Toast布局实现,而不是利用其它对象模拟,所以Toast的显示就不会依赖于acitvity,那么跨acitvity的操作也就不会导致Toast显示异常;另一方面,由于原生Toast的显示并不需要具备权限,而本发明实施例中的WindowManager的addView函数中用于表示显示视图参数的WindowManager.LayoutParams的被设置为原生Toast相同的等级,那么,显示本发明的Toast组件时自然也不需要申请权限,所以避免了Toast组件由于没有获得权限而显示异常。
下面通过附图以及具体实施例对本发明技术方案做详细的说明,应当理解本申请实施例以及实施例中的具体特征是对本申请技术方案的详细的说明,而不是对本申请技术方案的限定,在不冲突的情况下,本申请实施例以及实施例中的技术特征可以相互组合。
本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
本发明第一方面提供了一种Toast组件实现方法,请参考图1,为Toast组件实现方法的流程图。该方法包括:
S101:获得Toast布局;
S102:创建Toast根布局;
S103:通过所述Toast根布局的addView函数将所述Toast布局添加到Toast根布局中;
S104:通过WindowManager的addView函数将所述Toast根布局添加到所述WindowManager的对象中;
S105:通过持有主线程消息队列的Handler对象将所述Toast根布局发送到所述主线程消息队列中,进而显示所述Toast根布局对应的Toast组件。
本发明实施例中的方法可以应用于智能手机、计算机、智能手表等电子设备中,只要该电子设备的操作系统包括安卓Android系统即可,本发明不做具体限制。
Toast组件是Android系统提供的一种用来在界面展示消息轻量级组件。
下面将结合图2示出的逻辑流程图来说明本发明实施例中的Toast组件实现方法。
在S101中,首先需要获得Toast布局。具体来讲,本发明实施例中获得Toast布局包括:
创建默认Toast布局,或者通过自定义布局传入接口接收自定义Toast布局;其中,所述默认Toast布局至少包括用于显示图片的子控件。
具体来讲,如果由管理人员自行创建Toast布局,在Android中创建Toast布局有两种方式,一种是通过XML(可扩展标记语言,Extensible MarkupLanguage)编辑布局文件来设计布局的样式,另一种是通过代码来创建布局。在具体实现过程中,本发明所属领域的普通技术人员可以根据实际进行选择,本发明不做具体限制。
以通过XML创建为例来进行介绍。首先按照设计需要,利用XML编辑出默认Toast布局。在本发明实施例中,为了使Toast能够直接显示图片,在创建默认Toast布局时,至少应当创建用于显示图片的子控件ImageView,并将ImageView包含在默认Toast布局中。当然,在具体实现过程中,还可以进一步在默认Toast布局中包含用于显示文本的TextView。其中,ImageView和TextView均为视图View。
因此,通过默认Toast布局的2个子控件ImageView和TextView,管理人员可以按照需要任意设置Toast组件需要显示的图片和文本,所以,实现了Toast组件不仅支持文本显示,还支持图片显示。
另外,本发明实施例的Android系统还对外提供了一个用于传入自定义Toast布局的接口,通过自定义布局传入接口,系统可以接收外界传入的自定义Toast布局。
因此,系统可以将接收到自定义Toast布局作为Toast布局,也可以获取自行创建的默认Toast布局作为Toast布局,本发明不做具体限制。具体来讲,如图2所示,S201中判断是否有自定义布局,如果没有自定义布局,则执行S202:创建一个包含ImageView和TextView布局,即默认Toast布局。
在S102中,创建Toast根布局。具体来讲,根布局直接通过代码创建。在本发明实施例中,假设直接利用FrameLayout类创建一个FrameLayout对象作为Toast根布局rootview,如图2示出的S203:创建一个FrameLayout对象rootview。通过对Toast根布局rootview的管理,就可以方便地直接对整个Toast组件显示内容进行管理。FrameLayout是Android布局控件的一种,FrameLayout可以包裹其他控件,其中,被包裹的控件称为FrameLayout的子控件。
在具体实现过程中,S101获得Toast布局和S102创建Toast根布局的执行顺序,可以S101在前,S102在后,也可以S102在前,S101在后,还可以同时执行S101和S102,本发明不做具体限制。
接下来,执行完S101和S102之后,在S103中,通过所述Toast根布局的addView函数将所Toast布局添加到Toast根布局中。
具体来讲,在本发明实施例中,S201中判断是否有自定义布局,如果判断是,即传入自定义布局对象不为null,则通过FrameLayout对象的addView函数将自定义Toast布局添加到rootview中;如果判断否,即传入自定义布局对象为null,则通过FrameLayout对象的addView函数将默认Toast布局添加到rootview中。
在本发明实施例中,addview函数接收一个view作为参数。为了方便介绍,无论添加到Toast根布局中的Toast布局具体为默认Toast布局还是自定义Toast布局,将添加到Toast根布局中的Toast布局称为childview。
另外,由于WindowManager(Android系统中窗口window的管理器,用于控制window的创建,销毁与更新)只支持通过XML文件进行编辑的显示消失动画,不支持通过代码创建的Animation(Animation是Android用来处理动画的组件)类对象。为了使Toast组件能对Animation类进行支持,将通过对rooview设置动画的方式实现设置Toast的动画。
因为Toast组件所有的视图都在rootview内部,所以对rootview进行动画处理就是对整个toast组件做动画处理。而Android系统的View直接支持Animation动画,所以通过rootview对外提供的设置显示消失动画的接口,就可以在S203和S204之间获得自定义的显示消失动画。因此,通过rootview对外的设置接口,就也实现自定义Toast组件显示消失动画。
进而,在S204中,调用rootview的addview方法,也即通过FrameLayot对象中的addview函数将设置动画和childview添加到Toast根布局中,完成对Toast组件的显示布局设置。
由上述描述可以看出,本发明实施例中按照Android系统本身创建Toast组件的方式创建Toast显示视图,并不是以其他对象,如Dialog来模拟,所以,本发明实施例中的Toast组件的显示并不依赖于activity。那么,跨activity的操作就不会导致应用中Toast组件的消失。
接下来,完成显示布局的设置后,就需要在界面上显示Toast组件了。在S104中,通过WindowManager的addView函数将Toast根布局添加到WindowManager的对象中。
具体来讲,Android系统中所有显示的view都是通过WindowManager进行管理,WindowManager的对象可以通过系统提供的函数getSystenService获取,得到WindowManager的对象后再调用WindowManager对象的addview函数将rootview添加进去,通过addview函数添加的view就能在Android的界面上显示了。
所以,在S205中,getSystenService获取WindowManager对象,然后,S207中,调用WindowManager的addview。
为了Toast组件能够正常显示,在S207之前的S206中,还需要创建WindowManager.LayoutParams。
具体来讲,WindowManager的addview具有两个参数,第一个是需要显示视图view,在本发明实施例中就是rootview;第二个就是WindowManager.LayoutParams。WindowManager.LayoutParams是用于表示显示视图参数,例如显示视图的坐标位置,视图的宽和高等。
在同一个Android屏幕中,高等级的视图会覆盖在低等级的视图之上。等级过高就需要获得SYSTEM_ALERT_WINDOW权限才能够显示。为了解决现有技术中需申请权限才能够显示Toast组件的技术问题,本发明实施例中,将WindowManager.LayoutParams中表示等级的Type参数的值设置为与原生Toast一致,避免额外的权限申请。
另外,在S104之前,S206还包括将WindowManager.LayoutParams的Flags参数置为不可点击状态。具体来讲,为了避免无端消耗设备资源,还需要将WindowManager.LayoutParams的Flags参数设置为Toast组件不可点击。在具体实现过程中,还可以进一步将Flags设置为Toast在锁屏情况不显示和没有焦点等。本发明所属领域的普通技术人员可以根据实际进行设置,本发明不做具体限制。
在具体实现过程中,S205和S206的执行顺序不分先后,本发明所属领域的普通技术人员可以根据需要任意设置。
通过设置好的布局参数和创建好的视图,可以直接通过WindowManager的addview将视图显示在手机屏幕上,但是直接显示却有一个问题,Android的view更新的操作并不是线程安全的。线程安全是指在多线程编码情况下,如果两个线程在同一时间访问同一个资源,那么这个资源的状态具有不确定性(比如两个线程同时进行写操作,其结果不确定),线程安全就是要保证其结果具有唯一性,比如让某一个线程先访问,某个线程后访问等。如果直接在异步线程(即不同于主线程的线程)中显示视图系统会抛出异常,导致应用挂掉。
为了解决在普通线程中显示的问题,首先需要创建一个持有主线程消息队列的Handler对象。Handler是对消息进行控制的系统组件,可以将消息发送到指定的线程。Android中的点击事件,绘制事件都可以认为是一个消息,系统将这些消息放入到一个队列之中依次进行处理,同时也可以通过Looper组件创建自己的消息队列。Looper是用于创建消息队列与消息循环的组件。
具体来讲,S208中,通过Looper.getMainLooper创建持有主线程消息队列Handler。具体为,通过Looper.getMainLooper获得主线程消息队列,然后将主线程消息队列作为参数创建Handler对象,使得创建出的Handler持有主线程消息队列。那么,所有通过此Handler发送的消息都会发送到主线程消息队列中,进而在主线程运行。具体地,Handler通过Handler的post函数将WindowManager的addview发送到主线程(图2中未示出),进而将rootview发送到主线程。发送时的基本代码例如为
Handler.post(new Runable(){//发送一个消息到Handler持有的线程
WindowManager.addView(rootview,LayoutParams)//创建的视图显示到界面
});
最终,主线程读取到Toast组件显示的消息时,S209中运行,即显示该Toast组件。
进一步,由于现有技术中的Toast显示时长只有固定的LENGTH_SHORT(Toast组件内部的宏定义)定义的4秒时间和LENGTH_LONG(Toast组件内部的宏定义)定义的5秒。为了能够控制Toast组件的显示时长,本发明实施例中的S105之后,还可以进一步包括:
通过所述Handler对象的postDelayed函数将所述Toast根布局和延迟时间发送到所述Handler对象持有的所述主线程消息队列中,进而显示所述Toast根布局对应的Toast组件,并在显示所述Toast组件所述延迟时间后移除所述Toast组件。
具体来讲,postDelayed函数与post函数作用相同,都是将消息传入到Handler对象持有的消息队列中,不过,postDelayed较post函数多支持一个参数,该参数就是延迟时间。在线程读取到postDelayed发送消息时,将通过延迟时间执行相应的操作。所以,在post函数将rootview发送到主线程之后,通过Handler的postDelayed的函数延迟执行,在S210中传入延迟参数time,将按照需要设置的延迟时间和rootview发送给WindowManager的remove。在主线程读取到该消息后,等待Toast组件显示延迟时间后,S211中WindowManager的remove移除Toast组件。最后,S212中关闭Toast组件。
发送时的基本代码例如为
Handler.postDelayed(new Runable(){//将消息延迟time时间再发送到持有的线程
WindowManager.remove(rootview)//将显示的视图从界面上移除
},time);
所以,通过上述过程中,实现了任意设置Toast组件的显示时长。
在具体实现过程中,本发明所属领域的普通技术人员可以根据需要选择post发送或者PostDelayed发送,本发明不做具体限制。
进一步,本发明实施例中的方法还可以包括:
基于懒加载加载单例模式;
显示所述Toast根布局对应的Toast组件,包括:
判断WindowManager是否存在Toast组件的单例;
当存在所述Toast组件的单例时,以当前从所述主线程消息队列中读取到的所述Toast组件刷新已存在的所述Toast组件的单例;
当不存在所述Toast组件的单例时,创建所述Toast组件的单例,并显示当前从所述主线程消息队列中读取到的所述Toast组件。
具体来讲,当多次调用时会出现创建多个Toast对象,多个Toast对象叠加在一起,影响用户体验与系统资源,为了解决这个问题引入单例模式,单例模式保证同一个进程中一个类只有一个对象。也就是说在同一个进程之中,任何地方使用Toast都是同一个对象,这样就不会出现Toast重叠情况。当当前正在显示Toast组件时,如果再次调用Toast组件并不重新创建Toast组件,而是直接Toast刷新内容,并且重置Toast的显示时间。单例模式的常规的使用是类长期持有一个唯一的对象,在本发明实施例中,为了节省系统资源,通过懒加载加载实现单例。那么,在显示Toast组件时,先判断WindowManager是否存在Toast组件的单例。如果存在,则直接以当前从主线程消息队列中读取到的Toast组件刷新已存在的Toast组件的单例;如果不存在,则创建Toast组件的单例,并显示当前从主线程消息队列中读取到的Toast组件。
由上述描述可以看出,通过单例模式显示Toast组件,使得主线程中仅有一个Toast组件,所以同一个单位时间最多只有一个Toast组件在显示,所以避免在用户大量的重复操作时出现多个Toast组件重叠显示,造成内存浪费和界面的卡顿。并且,由于只有一个Toast组件,所以关闭Toast组件时,不需要再通过变量保存,而是可以在任何地方通过直接关闭。
通过上述技术方案,Toast组件的显示时间可以任意设置,只有一个Toast显示,不会叠加显示多个Toast。并且,关闭Toast时不再需要保存所有Toast的变量。Toast也通过ImageView可以支持图片显示,通过动画设置接口可以设置Toast组件的显示消失动画,且能够在任意线程中进行显示。所以,本发明在解决上述多个Toast缺点的同时,一方面,由于本发明实施例的Toast组件由Toast布局实现,所以Toast的显示就不会依赖于acitvity;另一方面,通过为WindowManager.LayoutParams的设置与原生Toast相同的等级,所以显示本发明的Toast组件时避免了Toast组件由于没有获得权限而显示异常。
基于与前述实施例中Toast组件实现方法同样的发明构思,本发明第二方面还提供一种Toast组件实现系统,如图3所示,包括:
布局获得模块101,用于获得Toast布局;
根布局创建模块102,用于创建Toast根布局;
第一添加模块103,用于通过所述Toast根布局的addView函数将所述Toast布局添加到Toast根布局中;
第二添加模块104,用于通过WindowManager的addView函数将所述Toast根布局添加到所述WindowManager的对象中;其中,所述WindowManager的addView函数中用于表示显示视图参数的WindowManager.LayoutParams的等级与原生Toast相同;
消息发送模块105,用于通过持有主线程消息队列的Handler对象将所述Toast根布局发送到所述主线程消息队列中,进而显示所述Toast根布局对应的Toast组件。
其中,布局获得模块101用于创建默认Toast布局,或者通过自定义布局传入接口接收自定义Toast布局;其中,所述默认Toast布局至少包括用于显示图片的子控件。
进一步,所述系统还包括:
设置模块,用于在通过WindowManager的addView函数将所述Toast根布局添加到所述WindowManager的对象中之前,将所述WindowManager.LayoutParams的Flags参数置为不可点击状态。
更进一步,消息发送模块105还用于在通过持有主线程消息队列的Handler对象将所述Toast根布局发送到所述主线程消息队列中之后,通过所述Handler对象的postDelayed函数将所述Toast根布局和延迟时间发送到所述主线程消息队列中,进而在显示所述Toast组件所述延迟时间后移除所述Toast组件。
更进一步,所述系统还包括:
加载模块,用于基于懒加载加载单例模式;
显示模块,用于判断WindowManager是否存在Toast组件的单例;当存在所述Toast组件的单例时,以当前从所述主线程消息队列中读取到的所述Toast组件刷新已存在的所述Toast组件的单例;当不存在所述Toast组件的单例时,创建所述Toast组件的单例,并显示当前从所述主线程消息队列中读取到的所述Toast组件。
前述图1-图2实施例中的Toast组件实现方法的各种变化方式和具体实例同样适用于本实施例的Toast组件实现系统,通过前述对Toast组件实现方法的详细描述,本领域技术人员可以清楚的知道本实施例中Toast组件实现系统的实施方法,所以为了说明书的简洁,在此不再详述。
本申请实施例中的上述一个或多个技术方案,至少具有如下一种或多种技术效果:
在本发明实施例的技术方案中,首先获得Toast布局并创建根布局,接着,再通过WindowManager的addView函数将Toast根布局添加到WindowManager的对象中,最终持有主线程消息队列的handler对象将Toast根布局发送到主线程消息队列中,进而主线程处理到Toast根布局消息时,就能够显示对应的Toast组件。其中,WindowManager的addView函数中用于表示显示视图参数的WindowManager.LayoutParams的等级与原生Toast相同。可见,一方面,由于本发明实施例的Toast组件由Toast布局实现,而不是利用其它对象模拟,所以Toast的显示就不会依赖于acitvity,那么跨acitvity的操作也就不会导致Toast显示异常;另一方面,由于原生Toast的显示并不需要具备权限,而本发明实施例中的WindowManager的addView函数中用于表示显示视图参数的WindowManager.LayoutParams的被设置为原生Toast相同的等级,那么,显示本发明的Toast组件时自然也不需要申请权限,所以避免了Toast组件由于没有获得权限而显示异常。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

Claims (10)

1.一种Toast组件实现方法,其特征在于,包括:
获得Toast布局;
创建Toast根布局;
通过所述Toast根布局的addView函数将所述Toast布局添加到Toast根布局中;
通过WindowManager的addView函数将所述Toast根布局添加到所述WindowManager的对象中;其中,所述WindowManager的addView函数中用于表示显示视图参数的WindowManager.LayoutParams的等级与原生Toast相同;
通过持有主线程消息队列的Handler对象将所述Toast根布局发送到所述主线程消息队列中,进而显示所述Toast根布局对应的Toast组件。
2.如权利要求1所述的方法,其特征在于,获得Toast布局,包括:
创建默认Toast布局,或者通过自定义布局传入接口接收自定义Toast布局;其中,所述默认Toast布局至少包括用于显示图片的子控件。
3.如权利要求1所述的方法,其特征在于,在通过WindowManager的addView函数将所述Toast根布局添加到所述WindowManager的对象中之前,还包括:
将所述WindowManager.LayoutParams的Flags参数置为不可点击状态。
4.如权利要求1所述的方法,其特征在于,在通过持有主线程消息队列的Handler对象将所述Toast根布局发送到所述主线程消息队列中之后,还包括:
通过所述Handler对象的postDelayed函数将所述Toast根布局和延迟时间发送到所述主线程消息队列中,进而在显示所述Toast组件所述延迟时间后移除所述Toast组件。
5.如权利要求1所述的方法,其特征在于,所述方法还包括:
基于懒加载加载单例模式;
显示所述Toast根布局对应的Toast组件,包括:
判断WindowManager是否存在Toast组件的单例;
当存在所述Toast组件的单例时,以当前从所述主线程消息队列中读取到的所述Toast组件刷新已存在的所述Toast组件的单例;
当不存在所述Toast组件的单例时,创建所述Toast组件的单例,并显示当前从所述主线程消息队列中读取到的所述Toast组件。
6.一种Toast组件实现系统,其特征在于,包括:
布局获得模块,用于获得Toast布局;
根布局创建模块,用于创建Toast根布局;
第一添加模块,用于通过所述Toast根布局的addView函数将所述Toast布局添加到Toast根布局中;
第二添加模块,用于通过WindowManager的addView函数将所述Toast根布局添加到所述WindowManager的对象中;其中,所述WindowManager的addView函数中用于表示显示视图参数的WindowManager.LayoutParams的等级与原生Toast相同;
消息发送模块,用于通过持有主线程消息队列的Handler对象将所述Toast根布局发送到所述主线程消息队列中,进而显示所述Toast根布局对应的Toast组件。
7.如权利要求6所述的Toast组件实现系统,其特征在于,所述布局获得模块用于创建默认Toast布局,或者通过自定义布局传入接口接收自定义Toast布局;其中,所述默认Toast布局至少包括用于显示图片的子控件。
8.如权利要求6所述的Toast组件实现系统,其特征在于,所述系统还包括:
设置模块,用于在通过WindowManager的addView函数将所述Toast根布局添加到所述WindowManager的对象中之前,将所述WindowManager.LayoutParams的Flags参数置为不可点击状态。
9.如权利要求6所述的Toast组件实现系统,其特征在于,所述消息发送模块还用于在通过持有主线程消息队列的Handler对象将所述Toast根布局发送到所述主线程消息队列中之后,通过所述Handler对象的postDelayed函数将所述Toast根布局和延迟时间发送到所述主线程消息队列中,进而在显示所述Toast组件所述延迟时间后移除所述Toast组件。
10.如权利要求6所述的Toast组件实现系统,其特征在于,所述系统还包括:
加载模块,用于基于懒加载加载单例模式;
显示模块,用于判断WindowManager是否存在Toast组件的单例;当存在所述Toast组件的单例时,以当前从所述主线程消息队列中读取到的所述Toast组件刷新已存在的所述Toast组件的单例;当不存在所述Toast组件的单例时,创建所述Toast组件的单例,并显示当前从所述主线程消息队列中读取到的所述Toast组件。
CN201610837712.8A 2016-09-21 2016-09-21 一种Toast组件实现方法和系统 Expired - Fee Related CN106383712B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610837712.8A CN106383712B (zh) 2016-09-21 2016-09-21 一种Toast组件实现方法和系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610837712.8A CN106383712B (zh) 2016-09-21 2016-09-21 一种Toast组件实现方法和系统

Publications (2)

Publication Number Publication Date
CN106383712A true CN106383712A (zh) 2017-02-08
CN106383712B CN106383712B (zh) 2020-03-17

Family

ID=57935802

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610837712.8A Expired - Fee Related CN106383712B (zh) 2016-09-21 2016-09-21 一种Toast组件实现方法和系统

Country Status (1)

Country Link
CN (1) CN106383712B (zh)

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106941568A (zh) * 2017-03-30 2017-07-11 努比亚技术有限公司 一种Toast弹窗优化显示方法、装置以及Toast弹窗调度方法和装置
CN107122186A (zh) * 2017-04-25 2017-09-01 努比亚技术有限公司 悬浮窗的管理方法与管理装置
CN108287742A (zh) * 2018-01-10 2018-07-17 武汉斗鱼网络科技有限公司 一种实现浮层动画的方法、存储介质、电子设备和系统
CN110018813A (zh) * 2018-01-10 2019-07-16 武汉斗鱼网络科技有限公司 一种Toast设计方法、存储介质、电子设备及系统
CN110457132A (zh) * 2019-08-01 2019-11-15 武汉斗鱼鱼乐网络科技有限公司 一种功能对象的创建方法、装置和终端设备
CN112527443A (zh) * 2020-12-28 2021-03-19 平安普惠企业管理有限公司 提示框显示方法、装置、电子设备及计算机可读存储介质
CN113342548A (zh) * 2021-06-22 2021-09-03 平安普惠企业管理有限公司 一种基于Toast实现的消息通知方法、装置、设备及存储介质
CN116088714A (zh) * 2022-05-26 2023-05-09 荣耀终端有限公司 消息提示框处理方法和相关装置

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20100295797A1 (en) * 2009-05-21 2010-11-25 Sony Computer Entertainment America Inc. Continuous and dynamic scene decomposition for user interface
CN104572110A (zh) * 2015-01-19 2015-04-29 山东大学 一种安卓系统上Toast控件的优化方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20100295797A1 (en) * 2009-05-21 2010-11-25 Sony Computer Entertainment America Inc. Continuous and dynamic scene decomposition for user interface
CN104572110A (zh) * 2015-01-19 2015-04-29 山东大学 一种安卓系统上Toast控件的优化方法

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
WEIXIN_30719711: "Android中通过反射来设置Toast的显示时间", 《HTTPS://BLOG.CSDN.NET/JIANGWEI0910410003/ARTICLE/DETAILS/》 *
佚名: "android设计模式之单例模式详解", 《HTTPS://WWW.JB51.NET/ARTICLE/49221.HTM》 *
蓝天白云梦: "Android 自定义Toast:轻松实现深度可定制化的Toast", 《HTTPS://WWW.BAIDU.COM/LINK?URL=NBU-KHPP-U44IHCALXFCQMFC12R5NZ-68WIPRSQBFVQOP03ZJK1JHC0FUE4SMUQK&WD=&EQID=9716C4B70000467B000000055C9887FC》 *

Cited By (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106941568A (zh) * 2017-03-30 2017-07-11 努比亚技术有限公司 一种Toast弹窗优化显示方法、装置以及Toast弹窗调度方法和装置
CN107122186A (zh) * 2017-04-25 2017-09-01 努比亚技术有限公司 悬浮窗的管理方法与管理装置
CN107122186B (zh) * 2017-04-25 2020-06-09 南京秦淮紫云创益企业服务有限公司 悬浮窗的管理方法与管理装置
CN108287742A (zh) * 2018-01-10 2018-07-17 武汉斗鱼网络科技有限公司 一种实现浮层动画的方法、存储介质、电子设备和系统
CN110018813A (zh) * 2018-01-10 2019-07-16 武汉斗鱼网络科技有限公司 一种Toast设计方法、存储介质、电子设备及系统
CN108287742B (zh) * 2018-01-10 2020-08-04 武汉斗鱼网络科技有限公司 一种实现浮层动画的方法、存储介质、电子设备和系统
CN110457132A (zh) * 2019-08-01 2019-11-15 武汉斗鱼鱼乐网络科技有限公司 一种功能对象的创建方法、装置和终端设备
CN110457132B (zh) * 2019-08-01 2022-08-05 武汉斗鱼鱼乐网络科技有限公司 一种功能对象的创建方法、装置和终端设备
CN112527443A (zh) * 2020-12-28 2021-03-19 平安普惠企业管理有限公司 提示框显示方法、装置、电子设备及计算机可读存储介质
CN113342548A (zh) * 2021-06-22 2021-09-03 平安普惠企业管理有限公司 一种基于Toast实现的消息通知方法、装置、设备及存储介质
CN116088714A (zh) * 2022-05-26 2023-05-09 荣耀终端有限公司 消息提示框处理方法和相关装置
CN116088714B (zh) * 2022-05-26 2024-05-28 荣耀终端有限公司 消息提示框处理方法和相关装置

Also Published As

Publication number Publication date
CN106383712B (zh) 2020-03-17

Similar Documents

Publication Publication Date Title
CN106383712A (zh) 一种Toast组件实现方法和系统
CN107992301B (zh) 用户界面实现方法、客户端及存储介质
CN108052365B (zh) 用户界面的组件生成方法及装置
AU2008255126B2 (en) Animated user interface control elements
WO2020156308A1 (zh) 消息处理方法、装置、终端及存储介质
TWI413933B (zh) 圖形使用者介面之應用程式介面
Popp et al. Tool support for automated multi-device GUI generation from discourse-based communication models
CN103530018A (zh) 安卓操作系统中微件界面的建立方法及移动终端
CN106681593A (zh) 一种用户界面ui控件的显示控制方法及装置
US10452231B2 (en) Usability improvements for visual interfaces
CN110225246B (zh) 事件脚本的生成方法、装置、电子设备及计算机可读存储介质
TW201826109A (zh) 頁面展示方法及裝置
US20160274776A1 (en) System and method for modifying a look and feel of a graphical user interface for an application
CN102800045A (zh) 一种图像处理的方法及装置
CN104866318A (zh) 一种多窗口中标签页的展示方法及装置
CN112445564B (zh) 界面显示方法及电子设备、计算机可读存储介质
CN110413347A (zh) 应用程序中广告的处理方法、装置、存储介质及终端
WO2015018299A1 (zh) 用户界面实现方法及装置
CN107818588A (zh) Android系统基于JNI多线程调用Qt绘图的装置和方法
CN114625469B (zh) 基于虚拟资源的信息显示方法、装置、设备和介质
CN106648623B (zh) 一种安卓系统中字符的显示方法及装置
CN108536434A (zh) 一种基于高级程序设计语言实现钩子函数的方法及装置
CN112445501A (zh) 数据烧录方法及设备、计算机可读存储介质
CN107577454A (zh) 一种基于python的应用程序多线程运行优化方法
CN112017261B (zh) 贴纸生成方法、装置、电子设备及计算机可读存储介质

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20200317